Add more telemetry to the role editor (#54486)

Whenever the user clicks the save button, report whether the standard
and YAML modes were used and whether there were any YAML fields that
prevented the user from accessing the standard editor.
This commit is contained in:
Bartosz Leper
2025-05-12 11:19:36 +02:00
committed by GitHub
parent 07bba43beb
commit 793309934a
16 changed files with 923 additions and 445 deletions
+560 -365
View File
@@ -2736,9 +2736,13 @@ var xxx_messageInfo_UICreateNewRoleClickEvent proto.InternalMessageInfo
// UICreateNewRoleSaveClickEvent is an event that can be triggered during custom role creation
type UICreateNewRoleSaveClickEvent struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
StandardUsed bool `protobuf:"varint,1,opt,name=standard_used,json=standardUsed,proto3" json:"standard_used,omitempty"`
YamlUsed bool `protobuf:"varint,2,opt,name=yaml_used,json=yamlUsed,proto3" json:"yaml_used,omitempty"`
ModeWhenSaved string `protobuf:"bytes,3,opt,name=mode_when_saved,json=modeWhenSaved,proto3" json:"mode_when_saved,omitempty"`
FieldsWithConversionErrors []string `protobuf:"bytes,4,rep,name=fields_with_conversion_errors,json=fieldsWithConversionErrors,proto3" json:"fields_with_conversion_errors,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UICreateNewRoleSaveClickEvent) Reset() { *m = UICreateNewRoleSaveClickEvent{} }
@@ -2774,6 +2778,34 @@ func (m *UICreateNewRoleSaveClickEvent) XXX_DiscardUnknown() {
var xxx_messageInfo_UICreateNewRoleSaveClickEvent proto.InternalMessageInfo
func (m *UICreateNewRoleSaveClickEvent) GetStandardUsed() bool {
if m != nil {
return m.StandardUsed
}
return false
}
func (m *UICreateNewRoleSaveClickEvent) GetYamlUsed() bool {
if m != nil {
return m.YamlUsed
}
return false
}
func (m *UICreateNewRoleSaveClickEvent) GetModeWhenSaved() string {
if m != nil {
return m.ModeWhenSaved
}
return ""
}
func (m *UICreateNewRoleSaveClickEvent) GetFieldsWithConversionErrors() []string {
if m != nil {
return m.FieldsWithConversionErrors
}
return nil
}
// UICreateNewRoleCancelClickEvent is an event that can be triggered during custom role creation
type UICreateNewRoleCancelClickEvent struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -5801,368 +5833,375 @@ func init() {
}
var fileDescriptor_94cf2ca1c69fd564 = []byte{
// 5776 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x5b, 0x6c, 0x1b, 0xcb,
0x79, 0xe6, 0xea, 0x62, 0xcb, 0x63, 0x5b, 0x5e, 0xaf, 0x6d, 0x99, 0x92, 0x2c, 0x5f, 0xe8, 0xbb,
0xce, 0x39, 0xf2, 0xb1, 0x8e, 0x93, 0xe3, 0x73, 0x49, 0x4e, 0x57, 0xcb, 0x15, 0xb9, 0x16, 0xc9,
0xe5, 0x99, 0x5d, 0xda, 0xd1, 0x09, 0x82, 0xe9, 0x8a, 0x3b, 0x92, 0xb7, 0xa2, 0xb8, 0xcc, 0xee,
0x52, 0x3a, 0x42, 0x11, 0x24, 0x6d, 0xda, 0xa0, 0x68, 0x92, 0xa6, 0x05, 0x8a, 0xa0, 0x40, 0x80,
0x5e, 0xd0, 0x0b, 0xfa, 0x50, 0xa0, 0x4f, 0x45, 0x9e, 0x0a, 0xb4, 0x40, 0x0b, 0xf4, 0xb1, 0x40,
0xfb, 0xd6, 0x97, 0x22, 0x4f, 0x7d, 0xeb, 0x53, 0x0b, 0xb4, 0x69, 0xd1, 0x62, 0x2e, 0x7b, 0x21,
0xb9, 0xe4, 0xae, 0x4f, 0x7d, 0x1a, 0xc0, 0x7e, 0x23, 0x67, 0xfe, 0xcb, 0x37, 0x33, 0xff, 0xfc,
0xf3, 0xcf, 0xcc, 0x3f, 0x0b, 0xee, 0x07, 0xb8, 0x83, 0x7b, 0xae, 0x17, 0x3c, 0xe8, 0xfb, 0xd6,
0x1e, 0xc6, 0x87, 0xb8, 0x1b, 0xf8, 0x0f, 0x0e, 0x1f, 0x26, 0xff, 0xae, 0xf5, 0x3c, 0x37, 0x70,
0xa5, 0xcb, 0x21, 0xe9, 0x5a, 0xb2, 0xee, 0xf0, 0xe1, 0xd2, 0xdd, 0x48, 0x86, 0xd5, 0x6e, 0x63,
0xdf, 0xef, 0x38, 0x7e, 0x40, 0x44, 0xc4, 0xff, 0x98, 0x84, 0xd2, 0x2a, 0x90, 0x5a, 0xda, 0x86,
0xd5, 0xed, 0x62, 0x4f, 0xe9, 0x38, 0xed, 0x7d, 0x95, 0x88, 0x90, 0x2e, 0x82, 0x59, 0xab, 0x83,
0xbd, 0xa0, 0x28, 0x5c, 0x17, 0xee, 0x9d, 0x82, 0xec, 0x4f, 0x69, 0x13, 0xdc, 0x6b, 0x69, 0x7a,
0x77, 0xc7, 0xb5, 0x3c, 0x5b, 0x71, 0x0f, 0x7a, 0x1d, 0x1c, 0xe0, 0x8a, 0x6b, 0xba, 0x65, 0xcb,
0x7f, 0xce, 0x0a, 0x63, 0x09, 0x4b, 0x60, 0xae, 0xef, 0x63, 0xaf, 0x6b, 0x1d, 0x60, 0x2e, 0x24,
0xfa, 0x5f, 0xba, 0x0d, 0x6e, 0x46, 0x72, 0x64, 0xdb, 0xde, 0x74, 0x3c, 0x3f, 0x80, 0xd8, 0x77,
0xfb, 0x5e, 0x1b, 0xc7, 0x22, 0x4a, 0xab, 0x09, 0x75, 0xc3, 0x64, 0x35, 0x2b, 0x48, 0x02, 0x2e,
0x7d, 0x04, 0x6e, 0x44, 0xb4, 0x06, 0x0e, 0x14, 0x0f, 0xdb, 0xb8, 0x1b, 0x38, 0x56, 0xc7, 0xe8,
0xef, 0x1c, 0x38, 0x41, 0x36, 0xa6, 0xa4, 0x80, 0x8f, 0xfb, 0xd8, 0x0f, 0x1c, 0xb7, 0xdb, 0xb5,
0x1c, 0x0f, 0xe7, 0x15, 0xf0, 0x0d, 0x70, 0x3b, 0x12, 0x00, 0xf1, 0x9e, 0xe3, 0x13, 0x80, 0xcf,
0xad, 0x4e, 0x07, 0x77, 0xf7, 0xf2, 0x0a, 0x91, 0x16, 0xc1, 0xdc, 0xc1, 0xae, 0x85, 0x82, 0xe3,
0x1e, 0x2e, 0x4e, 0xd1, 0xba, 0x93, 0x07, 0xbb, 0x96, 0x79, 0xdc, 0xc3, 0xd2, 0x0a, 0x00, 0x1d,
0x77, 0xcf, 0xe9, 0xa2, 0xdd, 0x8e, 0x7b, 0x54, 0x9c, 0xa6, 0x95, 0xa7, 0x68, 0xc9, 0x66, 0xc7,
0x3d, 0x62, 0xf8, 0x21, 0x6e, 0xbb, 0x87, 0xd8, 0x3b, 0x56, 0x5c, 0x1b, 0xfb, 0x8a, 0xdb, 0x0d,
0x9c, 0x6e, 0x1f, 0xe7, 0x1c, 0x94, 0x0f, 0xc0, 0xca, 0x88, 0x80, 0xde, 0x71, 0x4e, 0xe6, 0x0f,
0xc1, 0xd5, 0x21, 0xe6, 0xa6, 0xe7, 0x74, 0x83, 0x9c, 0xdc, 0x25, 0x20, 0x96, 0x1d, 0x9f, 0x32,
0xd7, 0x71, 0x60, 0xd9, 0x56, 0x60, 0x49, 0xf3, 0x60, 0xca, 0xb1, 0x39, 0xe5, 0x94, 0x63, 0x97,
0x2c, 0x50, 0x0c, 0x69, 0x42, 0x1b, 0x88, 0x68, 0x55, 0x30, 0xe7, 0xf1, 0x32, 0xca, 0x31, 0xbf,
0x7e, 0x7f, 0x6d, 0xcc, 0xc4, 0x58, 0x1b, 0x16, 0x02, 0x23, 0xd6, 0xd2, 0x3e, 0x90, 0xc2, 0x5a,
0x23, 0xc0, 0x3d, 0x23, 0xb0, 0x82, 0xbe, 0x2f, 0x7d, 0x04, 0x4e, 0xf8, 0xf4, 0x17, 0x17, 0x7d,
0x37, 0x53, 0x34, 0x63, 0x84, 0x9c, 0x8d, 0xcc, 0x25, 0xec, 0x79, 0xae, 0xc7, 0x07, 0x94, 0xfd,
0x29, 0xfd, 0x91, 0x00, 0x16, 0x5a, 0x5a, 0x82, 0xc5, 0x0b, 0xb0, 0xcd, 0xba, 0x4a, 0x05, 0x73,
0x07, 0xbc, 0x69, 0x54, 0xe7, 0xe9, 0x1c, 0xcd, 0x09, 0xfb, 0x02, 0x46, 0xac, 0x92, 0x12, 0x01,
0x9f, 0xa2, 0x42, 0xde, 0xc8, 0x01, 0x3c, 0x6c, 0x75, 0x08, 0xbe, 0xf4, 0xdf, 0x02, 0xb8, 0x1e,
0xc3, 0x0c, 0x3b, 0xcd, 0xc0, 0x1d, 0xdc, 0x26, 0x33, 0xe4, 0xa5, 0x02, 0xae, 0x27, 0x86, 0x91,
0x41, 0x7e, 0x98, 0x7b, 0x18, 0x63, 0x71, 0xa1, 0x88, 0x44, 0xfb, 0xa7, 0x3f, 0x7b, 0xfb, 0x7f,
0x75, 0x8a, 0x38, 0xa1, 0x90, 0x40, 0xeb, 0x06, 0x78, 0xcf, 0xb3, 0x48, 0xcb, 0xe5, 0x67, 0x86,
0xae, 0x95, 0x15, 0xc5, 0xed, 0x76, 0x71, 0x3b, 0x78, 0xe5, 0xfb, 0xe1, 0xc7, 0x53, 0x49, 0x3b,
0x28, 0x5b, 0x81, 0xb5, 0x63, 0xf9, 0x18, 0x96, 0x0d, 0xb5, 0xeb, 0xb9, 0x9d, 0xce, 0xab, 0xde,
0x7e, 0xe9, 0x31, 0x28, 0xfa, 0xd4, 0xe8, 0xb1, 0x8d, 0x42, 0xc9, 0x3e, 0x6a, 0xbb, 0xfd, 0x6e,
0x50, 0x9c, 0xb9, 0x2e, 0xdc, 0x9b, 0x86, 0x0b, 0x61, 0x7d, 0x08, 0xc5, 0x57, 0x48, 0x6d, 0xe9,
0x3f, 0x04, 0x70, 0x25, 0xee, 0xb9, 0xad, 0xfe, 0x0e, 0x56, 0xb7, 0x5e, 0x93, 0x5e, 0x2b, 0x3d,
0x01, 0xc5, 0x96, 0xa6, 0x58, 0x9d, 0x8e, 0xe9, 0xca, 0xd4, 0x5f, 0x24, 0x16, 0x84, 0x35, 0x30,
0xdd, 0xe6, 0x2d, 0x9e, 0x5f, 0xbf, 0x32, 0x56, 0xba, 0x62, 0xca, 0x90, 0x10, 0x96, 0xbe, 0x3f,
0x9b, 0xec, 0xc7, 0x32, 0xee, 0x75, 0xdc, 0x63, 0x03, 0x7b, 0x87, 0x4e, 0x1b, 0xbf, 0xf2, 0xd6,
0xb7, 0x07, 0xce, 0xda, 0xb4, 0xc1, 0xe8, 0x00, 0x07, 0xcf, 0x5d, 0x9b, 0x9a, 0xdc, 0xfc, 0xfa,
0xc6, 0x58, 0x59, 0x93, 0x3a, 0x6a, 0x8d, 0x15, 0xd5, 0xa9, 0x24, 0x78, 0xc6, 0x4e, 0xfc, 0x93,
0x2c, 0x70, 0x9a, 0x2b, 0xa2, 0x21, 0xc8, 0x2c, 0x55, 0xf3, 0x73, 0xff, 0x17, 0x35, 0x24, 0x76,
0x81, 0xc0, 0x8e, 0x7e, 0x97, 0x10, 0x38, 0x93, 0x04, 0x20, 0xad, 0x80, 0xc5, 0xb2, 0xda, 0xac,
0xe9, 0xdb, 0xa8, 0xae, 0x9a, 0x55, 0xbd, 0x8c, 0x5a, 0x0d, 0xa3, 0xa9, 0x2a, 0xda, 0xa6, 0xa6,
0x96, 0xc5, 0x82, 0xb4, 0x00, 0xa4, 0xc1, 0x6a, 0xb9, 0x65, 0xea, 0xa2, 0x20, 0x15, 0xc1, 0xc5,
0xc1, 0xf2, 0xba, 0xdc, 0x68, 0xc9, 0x35, 0x71, 0xaa, 0x84, 0x01, 0x88, 0x55, 0x4b, 0xcb, 0xe0,
0x32, 0xa7, 0x33, 0xb7, 0x9b, 0xea, 0x90, 0xf0, 0xab, 0x60, 0x29, 0x59, 0xa9, 0x35, 0x0c, 0x53,
0xae, 0xd5, 0x90, 0xa1, 0x40, 0xad, 0x69, 0x8a, 0x82, 0xb4, 0x04, 0x16, 0x92, 0xf5, 0x72, 0x5d,
0xfe, 0x44, 0x6f, 0x20, 0x55, 0x31, 0xc4, 0xa9, 0xd2, 0x8f, 0x66, 0xc0, 0xad, 0xb8, 0xfd, 0x8a,
0x87, 0xad, 0x00, 0x87, 0xff, 0x8e, 0x15, 0xb7, 0xbb, 0xeb, 0xec, 0xbd, 0xf2, 0x76, 0xe9, 0x82,
0xb3, 0x6d, 0xda, 0xd2, 0x41, 0xbb, 0x7c, 0x92, 0xc3, 0x60, 0xc6, 0x77, 0xd8, 0x1a, 0xfb, 0x1d,
0xda, 0x67, 0x3b, 0xf1, 0xaf, 0xf4, 0x27, 0x02, 0x38, 0x93, 0xac, 0x26, 0xd6, 0xa3, 0xe8, 0x8d,
0x4d, 0xad, 0x92, 0x6e, 0x3d, 0x23, 0xd5, 0xf2, 0x33, 0x03, 0xa9, 0xca, 0x3a, 0x32, 0x8c, 0xba,
0x28, 0x90, 0xf1, 0x4f, 0xaf, 0x56, 0x35, 0x45, 0x15, 0xa7, 0xd2, 0xd9, 0x61, 0xd9, 0xa0, 0x26,
0x30, 0x2d, 0x2d, 0x82, 0x4b, 0x29, 0xec, 0x5b, 0x86, 0x38, 0x53, 0xfa, 0x2f, 0x01, 0x5c, 0x4b,
0x59, 0x2f, 0xf9, 0xbe, 0xe0, 0x95, 0x77, 0xfc, 0xbf, 0x34, 0x95, 0x9c, 0x1c, 0x61, 0xf3, 0xd9,
0xc8, 0xf5, 0x3d, 0x5c, 0x37, 0x6b, 0xc6, 0x2b, 0xdf, 0x07, 0xbf, 0x31, 0x05, 0x1e, 0x26, 0x1d,
0xa4, 0xbf, 0x1f, 0xb8, 0x3d, 0xb2, 0x0c, 0x1e, 0xe2, 0xb2, 0xe3, 0xe1, 0x76, 0xe0, 0x7a, 0xc7,
0xa6, 0xeb, 0x76, 0x7c, 0xad, 0xeb, 0x07, 0xd6, 0x6b, 0x10, 0x0d, 0x7c, 0x77, 0x0a, 0xac, 0x65,
0x75, 0x48, 0x64, 0x22, 0xaf, 0x7c, 0x6f, 0xfc, 0xd9, 0x14, 0xb8, 0x13, 0xf7, 0x86, 0xdc, 0x0f,
0xdc, 0xf0, 0x77, 0x22, 0x84, 0x7c, 0xe5, 0x57, 0x90, 0xbb, 0xe0, 0x5c, 0x7a, 0x38, 0x3d, 0xef,
0x0d, 0x86, 0xd1, 0xdf, 0x9a, 0x02, 0x37, 0xe3, 0xee, 0x52, 0x95, 0x75, 0x3a, 0x6b, 0xba, 0xaf,
0xd3, 0x5e, 0xf4, 0xdf, 0x05, 0xb0, 0x38, 0x1c, 0x71, 0x91, 0x85, 0xea, 0x35, 0x6b, 0x38, 0x8b,
0x1c, 0x1a, 0xae, 0xfd, 0xea, 0xfb, 0x88, 0x9f, 0x0a, 0xe0, 0xea, 0x70, 0xc3, 0xe5, 0x5e, 0x8f,
0x84, 0xd9, 0xaf, 0x41, 0x10, 0xf1, 0x9d, 0x29, 0x70, 0x7f, 0x42, 0x10, 0xa1, 0xc9, 0xf5, 0xa6,
0xdb, 0x71, 0xda, 0xc7, 0xaf, 0x7c, 0x47, 0xfc, 0x8f, 0x00, 0x4a, 0x71, 0x47, 0x34, 0x3d, 0xa7,
0xdb, 0x76, 0x7a, 0x56, 0xc7, 0x7f, 0x7d, 0x16, 0xcb, 0xff, 0x14, 0xc0, 0x4a, 0xdc, 0x03, 0x26,
0xf6, 0x03, 0x7e, 0xf0, 0xf6, 0x3a, 0xf8, 0xfd, 0x7f, 0x13, 0x40, 0x31, 0xe1, 0x05, 0xf8, 0xc5,
0x8b, 0xfd, 0xca, 0xb7, 0x7b, 0x99, 0x78, 0x7d, 0xee, 0xed, 0xf1, 0x11, 0x74, 0x3b, 0xc9, 0xcb,
0xa1, 0x6b, 0xc4, 0x20, 0x06, 0x2a, 0x0d, 0xeb, 0x30, 0x49, 0x70, 0x83, 0x6c, 0xc0, 0x06, 0xb9,
0x49, 0xb8, 0xd0, 0x49, 0x90, 0xbc, 0x09, 0x56, 0x87, 0x48, 0x9e, 0x3a, 0xf8, 0xa8, 0xec, 0xb6,
0xfb, 0x07, 0xb8, 0x1b, 0x58, 0x83, 0x07, 0x56, 0xa5, 0xbf, 0x10, 0xc0, 0x25, 0xd9, 0xf7, 0x1d,
0x62, 0x7b, 0x74, 0x08, 0x22, 0xdb, 0xbb, 0x0b, 0xce, 0xb5, 0xdd, 0xee, 0x21, 0xf6, 0x7c, 0xca,
0x83, 0xa2, 0x8b, 0x8b, 0xf9, 0x64, 0xb1, 0x66, 0x4b, 0x37, 0xc0, 0x99, 0xc0, 0x0d, 0xac, 0x0e,
0x0a, 0xdc, 0x7d, 0xdc, 0x65, 0x07, 0xf3, 0xd3, 0xf0, 0x34, 0x2d, 0x33, 0x69, 0x91, 0x74, 0x13,
0x9c, 0xed, 0x79, 0xee, 0x41, 0x2f, 0x08, 0x69, 0xa6, 0x29, 0xcd, 0x19, 0x56, 0xc8, 0x89, 0xde,
0x00, 0xe7, 0xdb, 0x11, 0x86, 0x90, 0x90, 0xc5, 0x4d, 0x62, 0x5c, 0xc1, 0x88, 0x4b, 0xff, 0x20,
0x80, 0x8b, 0x0c, 0xb7, 0xfa, 0x29, 0x6e, 0xf7, 0x3f, 0x03, 0xec, 0x15, 0x00, 0xba, 0xae, 0x8d,
0x79, 0x7c, 0xc6, 0x40, 0x9f, 0x22, 0x25, 0x34, 0x34, 0x1b, 0x69, 0xd5, 0x74, 0x8e, 0x56, 0xcd,
0xe4, 0x6d, 0xd5, 0xec, 0x98, 0x56, 0x3d, 0x06, 0x4b, 0xac, 0x51, 0x0d, 0x7c, 0xa4, 0x24, 0xe0,
0x46, 0xb7, 0x4d, 0x6d, 0x2b, 0xc0, 0x7b, 0xae, 0x77, 0x1c, 0xde, 0x36, 0x85, 0xff, 0x4b, 0x7f,
0x2e, 0x80, 0x0b, 0x8c, 0x55, 0xa6, 0x97, 0xa1, 0x10, 0x7f, 0xbd, 0x8f, 0xfd, 0x80, 0x60, 0x0c,
0xed, 0x97, 0x9d, 0x7e, 0x31, 0xc6, 0x33, 0x61, 0x21, 0x3d, 0x4e, 0xfa, 0x99, 0x8c, 0xe0, 0x8f,
0x04, 0x70, 0x26, 0x44, 0x4c, 0x8a, 0xa5, 0x05, 0x70, 0xc2, 0xa2, 0xbf, 0x38, 0x46, 0xfe, 0xef,
0x67, 0x83, 0xee, 0x16, 0x90, 0x58, 0x47, 0xd6, 0x1c, 0x3f, 0x18, 0x7b, 0x7f, 0xf7, 0x4d, 0x50,
0x4c, 0x52, 0x1d, 0xec, 0x24, 0xee, 0xfa, 0x24, 0x30, 0x93, 0xb8, 0x17, 0xa4, 0xbf, 0x25, 0x1d,
0x9c, 0x3b, 0xa0, 0x54, 0xfe, 0x73, 0xa7, 0x87, 0xf6, 0x9d, 0xae, 0x4d, 0x5b, 0x33, 0xbf, 0x7e,
0x27, 0x76, 0x25, 0x89, 0xcb, 0xec, 0xc3, 0x87, 0x6b, 0xf5, 0x88, 0x7c, 0xcb, 0xe9, 0xda, 0x70,
0xfe, 0x60, 0xe0, 0x7f, 0xe9, 0xab, 0x40, 0x8c, 0x01, 0xb0, 0x49, 0x2f, 0x55, 0x46, 0x9c, 0xe7,
0x78, 0x47, 0x35, 0xda, 0xc6, 0xd8, 0x7d, 0x0e, 0x0a, 0x6f, 0xf5, 0xec, 0xcf, 0x4f, 0x78, 0x19,
0x13, 0xe7, 0xff, 0xf2, 0x84, 0xff, 0xa5, 0x00, 0x16, 0x86, 0x07, 0xe6, 0x25, 0xf7, 0x8e, 0xf4,
0x49, 0x38, 0x96, 0x28, 0x92, 0x97, 0xb5, 0xc6, 0x8c, 0xb3, 0x95, 0x70, 0x58, 0xeb, 0x93, 0xf0,
0xbf, 0xe4, 0x01, 0xf8, 0x7f, 0xc7, 0xff, 0x92, 0xc7, 0xf8, 0x73, 0xc5, 0xff, 0x7b, 0x53, 0x49,
0xfc, 0x15, 0xcf, 0xea, 0x06, 0xbe, 0xe9, 0xb6, 0x7c, 0xec, 0x49, 0x6b, 0xe0, 0x02, 0x5d, 0x31,
0x90, 0xe7, 0x76, 0xb0, 0x8f, 0xf6, 0x48, 0x1d, 0x66, 0x3e, 0x61, 0x16, 0x9e, 0xa7, 0x55, 0x64,
0xcd, 0xf5, 0x2b, 0xac, 0x42, 0x92, 0xc1, 0x0a, 0xa3, 0x77, 0xba, 0xcf, 0xb1, 0xe7, 0xd0, 0xab,
0xb6, 0x01, 0xce, 0x69, 0xca, 0xb9, 0x44, 0x89, 0xb4, 0x90, 0x66, 0x40, 0xc4, 0xdb, 0xe0, 0x22,
0x13, 0x11, 0x78, 0x96, 0x13, 0xc4, 0x9c, 0x53, 0x94, 0x53, 0xa2, 0x75, 0x26, 0xad, 0x0a, 0x39,
0x14, 0x70, 0x75, 0x58, 0xe9, 0x10, 0xef, 0x0c, 0xe5, 0x5d, 0x1e, 0xd4, 0x3a, 0x28, 0x64, 0x19,
0x9c, 0xea, 0xfb, 0xd8, 0x43, 0xd4, 0x8b, 0xcd, 0xc6, 0xd9, 0x0d, 0x0d, 0xeb, 0x00, 0x97, 0x7e,
0x38, 0x9d, 0xec, 0x21, 0x88, 0x0f, 0x1d, 0x7c, 0xf4, 0xb2, 0x67, 0xd8, 0x63, 0xb0, 0x68, 0x5b,
0xc7, 0x3e, 0xea, 0x59, 0x7e, 0x80, 0xba, 0xf8, 0xd3, 0x00, 0x59, 0x7d, 0xdb, 0x09, 0x10, 0x99,
0x07, 0xbc, 0xf1, 0x97, 0x08, 0x41, 0xd3, 0x22, 0x0b, 0xe6, 0xa7, 0x81, 0x4c, 0x6a, 0xcb, 0x04,
0xc2, 0x26, 0xb8, 0x96, 0xf0, 0xb3, 0x1e, 0xfe, 0x7a, 0xdf, 0xf1, 0x30, 0x09, 0x7f, 0x7c, 0xd4,
0x7e, 0x6e, 0x75, 0xf7, 0x78, 0xb7, 0xcf, 0xc1, 0x95, 0x98, 0x0c, 0x26, 0xa8, 0x14, 0x46, 0x24,
0x3d, 0x06, 0x45, 0x8f, 0x36, 0x0d, 0xed, 0x12, 0x21, 0xb8, 0xdb, 0x3e, 0x8e, 0x04, 0xcc, 0x50,
0x01, 0x0b, 0xac, 0x7e, 0x33, 0xac, 0x0e, 0x39, 0x3f, 0x04, 0xcb, 0x9c, 0xd3, 0xb6, 0x8e, 0x91,
0xbb, 0x8b, 0x0e, 0xdc, 0x6e, 0xf0, 0x3c, 0x62, 0x9e, 0xa5, 0xcc, 0x97, 0x19, 0x49, 0xd9, 0x3a,
0xd6, 0x77, 0xeb, 0xa4, 0x3e, 0xe4, 0x7e, 0x0f, 0x2c, 0x76, 0xfb, 0xd4, 0xb6, 0xdd, 0x5d, 0xe4,
0xe1, 0x03, 0xf7, 0x10, 0xdb, 0x88, 0x43, 0x2d, 0x9e, 0xa0, 0x2d, 0x5f, 0x60, 0x04, 0xfa, 0x2e,
0x64, 0xd5, 0x7c, 0xa1, 0x28, 0xfd, 0xb6, 0x30, 0x3a, 0x30, 0x2f, 0x7b, 0xea, 0x3d, 0x04, 0x97,
0xd8, 0x2a, 0x85, 0xc8, 0x32, 0x85, 0x78, 0x43, 0x1d, 0x9b, 0x27, 0x83, 0x48, 0xd6, 0x90, 0x7e,
0xcd, 0x2e, 0x7d, 0x4f, 0x00, 0x8b, 0x89, 0x44, 0x03, 0x76, 0x55, 0x3c, 0x6e, 0x5d, 0x95, 0x36,
0xc0, 0x4c, 0x62, 0x71, 0x5c, 0x1b, 0x8b, 0x72, 0x44, 0x22, 0x5d, 0x24, 0x29, 0xef, 0xa0, 0xf9,
0x4e, 0x0f, 0x99, 0xaf, 0x4b, 0x02, 0xed, 0x11, 0x6e, 0x9a, 0xb0, 0xc2, 0x62, 0xad, 0xc6, 0x48,
0x5f, 0xad, 0xe7, 0x47, 0x91, 0xb2, 0x22, 0x79, 0xe0, 0x7a, 0x8a, 0xc2, 0x70, 0xdb, 0xf3, 0xf9,
0xe8, 0xfc, 0x06, 0x58, 0x4e, 0x69, 0x62, 0x94, 0x03, 0x54, 0x05, 0x33, 0x6d, 0xd7, 0x0e, 0x93,
0x8b, 0x1e, 0xe5, 0x57, 0xc5, 0xf8, 0x15, 0xd7, 0xc6, 0x90, 0x4a, 0x18, 0x93, 0x0c, 0xf4, 0xad,
0x29, 0x70, 0x25, 0xb5, 0x93, 0x71, 0xef, 0x73, 0x69, 0x2f, 0xb1, 0x1a, 0x3f, 0xc0, 0xbd, 0x17,
0xb7, 0x1a, 0x02, 0x09, 0x52, 0x5e, 0xa9, 0x36, 0xb4, 0xc7, 0x7b, 0xf4, 0x62, 0x52, 0x86, 0x36,
0x7b, 0xff, 0x24, 0x80, 0x0b, 0x51, 0x0e, 0x20, 0xf5, 0x8e, 0xac, 0xe5, 0xb9, 0xa2, 0xf2, 0xc4,
0x29, 0x32, 0x72, 0x3d, 0x67, 0xcf, 0xe9, 0xf2, 0xfe, 0x8d, 0x4e, 0x91, 0x75, 0x5a, 0x2a, 0xdd,
0x06, 0xf3, 0xed, 0x8e, 0xdb, 0xb7, 0x51, 0xcf, 0x73, 0x0f, 0x1d, 0x1b, 0x7b, 0xdc, 0xdc, 0xcf,
0xd2, 0xd2, 0x26, 0x2f, 0x94, 0x74, 0x30, 0x67, 0xf3, 0xe3, 0x26, 0xea, 0xbc, 0x4e, 0xaf, 0xbf,
0x93, 0xb9, 0x81, 0xc5, 0x76, 0x78, 0x42, 0x15, 0xf7, 0x77, 0x28, 0xa4, 0xf4, 0x14, 0x2c, 0x8d,
0xa7, 0x93, 0x2e, 0x83, 0x93, 0xf6, 0x4e, 0xb2, 0x75, 0x27, 0xec, 0x1d, 0xda, 0xae, 0x6b, 0xe0,
0xb4, 0xbd, 0x83, 0x68, 0xa2, 0x66, 0xdb, 0xed, 0xf0, 0x36, 0x01, 0x7b, 0xa7, 0xc9, 0x4b, 0x4a,
0xff, 0x2a, 0x80, 0xa5, 0x4d, 0x6c, 0x05, 0x7d, 0x0f, 0x43, 0xdc, 0x76, 0x0f, 0x0e, 0x70, 0xd7,
0x4e, 0x6c, 0x83, 0x06, 0x26, 0xb6, 0x30, 0x38, 0xb1, 0xa5, 0xf7, 0xc1, 0xc9, 0x5d, 0xc6, 0xca,
0xcd, 0xe0, 0xfa, 0xd8, 0x36, 0x86, 0x2a, 0x42, 0x06, 0xe9, 0x53, 0xb0, 0xc2, 0x7f, 0x22, 0x6f,
0x40, 0x2f, 0x4a, 0x98, 0xc4, 0xa4, 0x99, 0x92, 0x0a, 0x9a, 0x9b, 0xc4, 0xf2, 0xee, 0xf8, 0xca,
0xd2, 0x11, 0xb8, 0x68, 0xca, 0x15, 0xb6, 0x93, 0xc5, 0x1f, 0xf7, 0xb1, 0xc7, 0x8f, 0xff, 0xae,
0x01, 0xb6, 0xcd, 0x41, 0x64, 0x5f, 0xca, 0x72, 0xf5, 0xa6, 0x21, 0xa0, 0x45, 0x0d, 0x52, 0x12,
0x13, 0x60, 0x7b, 0x0f, 0x87, 0x5b, 0x23, 0x46, 0xa0, 0x92, 0x12, 0xb2, 0xcb, 0x75, 0x7c, 0xe4,
0xf7, 0xa9, 0x47, 0xe6, 0x8b, 0xde, 0x29, 0xc7, 0x37, 0x58, 0x41, 0xe9, 0x5f, 0xa6, 0xc1, 0x65,
0xe6, 0xea, 0x2b, 0x9e, 0xd5, 0x7b, 0x2e, 0x3f, 0x33, 0x8c, 0xb6, 0xd5, 0x0d, 0x73, 0x59, 0x2e,
0x70, 0xd9, 0xed, 0x75, 0xe4, 0xf0, 0x8b, 0x09, 0x06, 0x62, 0x06, 0x9e, 0x67, 0x3a, 0xda, 0xd1,
0x8d, 0x45, 0x02, 0x0b, 0x19, 0x0c, 0x86, 0x65, 0x86, 0x63, 0x21, 0x91, 0x93, 0x1f, 0x6f, 0xe4,
0xf6, 0x3c, 0xb7, 0xdf, 0x63, 0x68, 0x66, 0xf8, 0x46, 0xae, 0x42, 0x8b, 0x62, 0x19, 0x34, 0x46,
0xa2, 0x66, 0x1a, 0xca, 0xa0, 0x21, 0x11, 0xb1, 0x75, 0x46, 0xd0, 0x73, 0x3b, 0x4e, 0xdb, 0xc1,
0x6c, 0x2f, 0x3d, 0x03, 0xcf, 0xd2, 0xd2, 0x26, 0x2f, 0x94, 0xde, 0x04, 0x12, 0xc7, 0xbe, 0xef,
0xa3, 0x76, 0xa7, 0xef, 0x07, 0xe1, 0xca, 0x39, 0x03, 0x45, 0x06, 0x7d, 0xdf, 0x57, 0x78, 0x79,
0xdc, 0x52, 0xcf, 0xf6, 0x13, 0x2d, 0x3d, 0x99, 0x68, 0x29, 0xb4, 0xfd, 0xb8, 0xa5, 0xf7, 0x00,
0x93, 0x81, 0xfc, 0x77, 0xd0, 0x4e, 0xbf, 0xbd, 0x8f, 0x03, 0xbf, 0x38, 0x47, 0x89, 0x19, 0x38,
0xe3, 0x9d, 0x0d, 0x56, 0x4a, 0x42, 0x37, 0x4e, 0x69, 0x1d, 0x74, 0xa2, 0xf9, 0xe9, 0x17, 0x4f,
0x51, 0x6a, 0x86, 0xd1, 0xb0, 0x0e, 0x3a, 0xe1, 0x24, 0x4d, 0x70, 0xb8, 0x8e, 0xdd, 0x4e, 0x70,
0x80, 0x04, 0x87, 0xee, 0xd8, 0xed, 0x98, 0x23, 0xea, 0x12, 0xab, 0x4d, 0xc3, 0x39, 0xbf, 0x78,
0x3a, 0xd1, 0x25, 0x32, 0x2f, 0x2c, 0xfd, 0x50, 0x00, 0xb7, 0x5a, 0x5a, 0x62, 0xb0, 0x15, 0xcf,
0x3d, 0xea, 0x3e, 0xc1, 0x47, 0xb8, 0x53, 0x76, 0x76, 0x77, 0x9f, 0x3a, 0xf8, 0x88, 0x8d, 0xfb,
0x63, 0x50, 0xb4, 0x76, 0x77, 0x07, 0xb3, 0xc2, 0x50, 0x22, 0x11, 0xf5, 0x14, 0x5c, 0x08, 0xeb,
0xa3, 0xd4, 0x49, 0x76, 0x40, 0xf6, 0x08, 0x2c, 0x8c, 0x72, 0x26, 0xd2, 0x7e, 0x2f, 0x0e, 0xf3,
0xd1, 0xdc, 0x99, 0x4d, 0x70, 0xc5, 0xc0, 0xed, 0xbe, 0xe7, 0x04, 0xc7, 0x90, 0x4e, 0xab, 0x0a,
0x0e, 0x20, 0xf6, 0xfb, 0x1d, 0xbe, 0x14, 0xa7, 0x6d, 0xa4, 0x25, 0x30, 0x43, 0x22, 0x3f, 0x1e,
0x05, 0xd2, 0xdf, 0x25, 0x0b, 0x5c, 0x88, 0x32, 0x2f, 0x36, 0x71, 0xd0, 0x7e, 0xce, 0xd8, 0x47,
0xbd, 0xa3, 0x90, 0xe6, 0x1d, 0x47, 0x5c, 0xf2, 0xd4, 0xa8, 0x4b, 0x2e, 0xfd, 0x40, 0x00, 0x12,
0xb1, 0x65, 0xd3, 0xf2, 0xf7, 0xc9, 0xd4, 0xc5, 0x91, 0x47, 0x0a, 0x2c, 0x7f, 0x3f, 0xe9, 0xec,
0xe6, 0x48, 0x41, 0x98, 0xe2, 0xec, 0xf8, 0x7e, 0x7f, 0x40, 0xea, 0x29, 0x5a, 0x42, 0xab, 0x2f,
0x82, 0x59, 0xe2, 0x5d, 0xc2, 0x10, 0x85, 0xfd, 0x21, 0xbe, 0x3f, 0xb2, 0xc3, 0xc4, 0x0d, 0xe2,
0x2c, 0x9c, 0x8f, 0x8a, 0xd9, 0x0d, 0xe2, 0xdf, 0x7e, 0x00, 0xce, 0xb5, 0x88, 0x17, 0xa2, 0x48,
0xf4, 0x2e, 0xd6, 0x77, 0xa5, 0x16, 0x38, 0xd7, 0x77, 0xd0, 0x0e, 0x4d, 0x7f, 0x47, 0xed, 0x8e,
0xd3, 0xde, 0xcf, 0x0c, 0xf7, 0x46, 0xb3, 0xe5, 0xab, 0x05, 0x78, 0xb6, 0xef, 0x24, 0x4a, 0xa5,
0x1f, 0x09, 0xe0, 0x7e, 0xdf, 0x41, 0x2e, 0xcb, 0x06, 0x47, 0xfc, 0xc8, 0x04, 0xa3, 0x3d, 0x17,
0x05, 0x2e, 0xb2, 0xc3, 0x74, 0x79, 0xae, 0x91, 0x2d, 0x9f, 0xf2, 0x04, 0x8d, 0xf9, 0x72, 0xee,
0xab, 0x05, 0x78, 0xb3, 0xef, 0x64, 0xd2, 0x4a, 0xdf, 0x15, 0xc0, 0xcd, 0x04, 0x3a, 0xcb, 0xb6,
0xd1, 0xae, 0xe3, 0xd1, 0xe8, 0x94, 0x8f, 0x2a, 0xc3, 0xc5, 0x56, 0xbe, 0x0f, 0xb3, 0x71, 0x8d,
0xcf, 0xe1, 0xaf, 0x16, 0xe0, 0xd5, 0x08, 0x52, 0x2a, 0xd9, 0x70, 0x5f, 0xa5, 0xa0, 0xe9, 0x58,
0x41, 0x34, 0x3a, 0xb3, 0x79, 0xfb, 0x2a, 0xe3, 0xc1, 0xc0, 0x40, 0x5f, 0x8d, 0xa7, 0x95, 0x7e,
0x45, 0x00, 0xd7, 0x13, 0xe8, 0x7c, 0x1c, 0xa0, 0x76, 0xf4, 0xb6, 0x00, 0xf9, 0x34, 0xad, 0x9f,
0x3a, 0xcb, 0xd3, 0xeb, 0xef, 0x67, 0x83, 0x1a, 0xf7, 0x32, 0xa1, 0x5a, 0x80, 0x57, 0x22, 0x34,
0x29, 0x44, 0xd2, 0x6f, 0x0a, 0xe0, 0x56, 0x02, 0x86, 0xc7, 0xf3, 0x88, 0xc8, 0x26, 0x89, 0x3d,
0x30, 0x08, 0xa1, 0x9c, 0xa4, 0x50, 0xbe, 0x9c, 0x0d, 0x65, 0xd2, 0x13, 0x85, 0x6a, 0x01, 0x5e,
0x8f, 0xe0, 0x8c, 0x21, 0x0c, 0x7b, 0xc6, 0xe3, 0x49, 0xff, 0x88, 0x84, 0xb7, 0x64, 0x02, 0xb2,
0x47, 0x07, 0x7c, 0xb8, 0xe6, 0x32, 0x7b, 0x26, 0xe3, 0xc9, 0x02, 0xeb, 0x99, 0xf1, 0x44, 0xd2,
0xa7, 0xe0, 0x4a, 0x1a, 0x8a, 0xde, 0x31, 0x47, 0x70, 0x8a, 0x22, 0xf8, 0x62, 0x7e, 0x04, 0xc9,
0x37, 0x0f, 0xd5, 0x02, 0x2c, 0x8e, 0x68, 0xe7, 0x04, 0xd2, 0x2f, 0x82, 0x95, 0x51, 0xcd, 0x3d,
0xcf, 0xe9, 0x06, 0x5c, 0x35, 0xa0, 0xaa, 0xdf, 0xcd, 0xab, 0x7a, 0xe8, 0xc5, 0x44, 0xb5, 0x00,
0x17, 0x87, 0x74, 0xc7, 0x14, 0x52, 0x07, 0x2c, 0xf6, 0x1d, 0x64, 0x73, 0x27, 0x4e, 0xa2, 0x2e,
0x8f, 0x2c, 0x25, 0x54, 0x38, 0x5d, 0xd4, 0x4e, 0xaf, 0x3f, 0xc8, 0x91, 0x85, 0x97, 0x7c, 0x77,
0x50, 0x2d, 0xc0, 0x85, 0xbe, 0x93, 0xfa, 0x22, 0xe1, 0xbb, 0xcc, 0xfc, 0x22, 0x75, 0xf1, 0x5a,
0x17, 0x26, 0x5f, 0x70, 0xcd, 0x67, 0xa8, 0xe6, 0xf7, 0x72, 0x68, 0x4e, 0x7f, 0x4a, 0xc0, 0x2c,
0x2f, 0xe3, 0xb9, 0xc1, 0x37, 0xa9, 0xe1, 0x45, 0x60, 0x78, 0xc2, 0xaa, 0xcf, 0x72, 0x4f, 0x39,
0x90, 0xb3, 0x14, 0xc8, 0x17, 0x3e, 0x53, 0xe6, 0x2a, 0xb3, 0xb9, 0x09, 0x99, 0xc6, 0xbf, 0xc6,
0x1c, 0x68, 0x8c, 0x80, 0x07, 0xf4, 0xf1, 0xbc, 0x64, 0x20, 0xe6, 0x29, 0x88, 0xc7, 0x79, 0x40,
0xa4, 0x25, 0x08, 0x56, 0x0b, 0xf0, 0x5a, 0x02, 0x47, 0x6a, 0x0e, 0xe1, 0xef, 0x30, 0xef, 0x39,
0x0a, 0xa5, 0x1d, 0xde, 0x0d, 0xa3, 0x83, 0xa0, 0xe3, 0x73, 0x40, 0xe7, 0x28, 0xa0, 0x2f, 0xbd,
0x00, 0xa0, 0xd1, 0x94, 0xbd, 0x6a, 0x01, 0xde, 0x1a, 0x45, 0x15, 0xd3, 0x05, 0x1d, 0x9e, 0xb5,
0xf4, 0xd7, 0x02, 0x78, 0x3c, 0x38, 0x4e, 0x34, 0xe1, 0x0b, 0x59, 0x34, 0xe3, 0x0b, 0xd9, 0x61,
0xca, 0x17, 0x0a, 0x5c, 0xb7, 0xc3, 0x83, 0xc9, 0x4e, 0x87, 0x23, 0x15, 0x29, 0xd2, 0x27, 0xb9,
0xc6, 0x2f, 0x57, 0x62, 0x5d, 0xb5, 0x00, 0x1f, 0x26, 0x07, 0x35, 0x5f, 0x36, 0xde, 0x8f, 0x05,
0xf0, 0x28, 0x57, 0x1b, 0xe2, 0xee, 0x66, 0xf8, 0xcf, 0x53, 0xfc, 0x95, 0xcf, 0x8c, 0x7f, 0xf0,
0x6a, 0xbf, 0x5a, 0x80, 0x6b, 0x59, 0xe0, 0x87, 0x92, 0x01, 0x7e, 0x57, 0x00, 0x6f, 0x24, 0x91,
0x5b, 0x7d, 0x12, 0x79, 0x44, 0x7b, 0xd0, 0xc4, 0x23, 0x06, 0x06, 0x58, 0xa2, 0x80, 0x3f, 0xca,
0x01, 0x78, 0x52, 0xaa, 0x5a, 0xb5, 0x00, 0xef, 0xc4, 0x40, 0x27, 0x26, 0xb5, 0xfd, 0xa9, 0x00,
0x1e, 0x64, 0x58, 0xae, 0x63, 0x1d, 0xb0, 0xcd, 0xcb, 0x31, 0x07, 0x79, 0x81, 0x82, 0xdc, 0xf8,
0x2c, 0xf6, 0x3b, 0x98, 0x2d, 0x52, 0x2d, 0xc0, 0xfb, 0x13, 0x8c, 0x58, 0xb3, 0x0e, 0x92, 0xa9,
0x25, 0xbf, 0x25, 0x80, 0x3b, 0x49, 0xa8, 0xbd, 0x28, 0x03, 0x63, 0x64, 0xdc, 0x2f, 0x52, 0x84,
0x1f, 0xe4, 0x40, 0x38, 0x2e, 0x8d, 0xa3, 0x5a, 0x80, 0xa5, 0x18, 0xda, 0xd8, 0x64, 0x8f, 0x5f,
0x16, 0xc0, 0x8d, 0x24, 0xa6, 0x00, 0xfb, 0x01, 0x41, 0xd3, 0x1d, 0xf0, 0xc7, 0x97, 0x32, 0x57,
0xbf, 0x09, 0x39, 0x15, 0xd5, 0x02, 0x5c, 0x89, 0x91, 0xa4, 0x25, 0x5d, 0x78, 0x60, 0x39, 0x89,
0x21, 0x8c, 0x73, 0xc3, 0x75, 0x68, 0x21, 0xe3, 0x92, 0x61, 0x5c, 0x52, 0x03, 0x5b, 0x76, 0xc7,
0x24, 0x3c, 0x74, 0x40, 0xb1, 0xef, 0x90, 0x20, 0xcc, 0x0a, 0x30, 0xea, 0xe2, 0x23, 0xba, 0xff,
0xe5, 0x2b, 0xee, 0xe5, 0x8c, 0xa3, 0xb1, 0xb1, 0xe9, 0x04, 0xd5, 0x02, 0xbc, 0xd8, 0x77, 0x46,
0x2b, 0xa5, 0x63, 0xba, 0xc8, 0x0f, 0x6b, 0xf3, 0xad, 0xc3, 0x50, 0x65, 0x31, 0xb3, 0x87, 0x27,
0x24, 0x29, 0xb0, 0x86, 0xa6, 0x13, 0x48, 0xdf, 0x04, 0xd7, 0xd2, 0x1a, 0x4a, 0x93, 0x18, 0xb8,
0xf2, 0xc5, 0xcc, 0x05, 0x66, 0x62, 0x02, 0x44, 0xb5, 0x00, 0x97, 0x86, 0x5b, 0x1d, 0x93, 0x48,
0x7f, 0xc0, 0x5c, 0xc8, 0x30, 0x02, 0x76, 0x54, 0x9f, 0x4c, 0x92, 0xe0, 0x68, 0x96, 0x28, 0x1a,
0x25, 0x2f, 0x9a, 0x09, 0xb9, 0x16, 0xd5, 0x02, 0xbc, 0x3d, 0x04, 0x2c, 0x9d, 0x5a, 0xfa, 0x63,
0x01, 0xac, 0x25, 0x4d, 0xd0, 0x89, 0x8f, 0x1a, 0x91, 0x75, 0xe4, 0xb3, 0xa3, 0x01, 0x3e, 0x2d,
0xb8, 0x55, 0x2e, 0x67, 0x6e, 0x21, 0xf2, 0x3d, 0xf7, 0xab, 0x16, 0xe0, 0xbd, 0xd8, 0x4a, 0x93,
0xb4, 0x47, 0xbe, 0xee, 0xd8, 0xed, 0x81, 0xa7, 0x81, 0xdf, 0x13, 0xc0, 0xed, 0xf4, 0x90, 0xc1,
0xf6, 0x11, 0xa6, 0x87, 0xa2, 0x1c, 0xde, 0x95, 0xdc, 0x21, 0x54, 0xfa, 0x2b, 0xbc, 0xc1, 0x10,
0x2a, 0xa2, 0xb1, 0xfd, 0xe4, 0x9b, 0xb3, 0x80, 0x99, 0x35, 0x59, 0x6f, 0x03, 0x17, 0xb1, 0xec,
0x01, 0x36, 0x8a, 0x1c, 0xc5, 0x4a, 0xe6, 0xd4, 0x4d, 0x7f, 0xd6, 0xc5, 0x2d, 0x3a, 0xfd, 0xc9,
0xd7, 0xd7, 0xc0, 0x79, 0x8b, 0xa6, 0x31, 0xa0, 0x38, 0x89, 0xa0, 0x78, 0x95, 0x6a, 0x1a, 0x7f,
0x04, 0x9d, 0x9a, 0x72, 0x53, 0x2d, 0x40, 0xd1, 0x1a, 0xaa, 0x08, 0x5d, 0x62, 0xd2, 0x04, 0x78,
0xcf, 0xd2, 0xf0, 0x98, 0xb7, 0xec, 0x5a, 0xe6, 0x84, 0x9d, 0x70, 0xd9, 0xc1, 0x5c, 0xe2, 0xa4,
0xdb, 0x10, 0x1e, 0x2a, 0xa7, 0x80, 0x88, 0x4e, 0x01, 0x18, 0x8e, 0xeb, 0x99, 0xe3, 0x3c, 0xf9,
0x0e, 0x84, 0x8d, 0x73, 0xc6, 0x3d, 0xc9, 0xb7, 0x05, 0xea, 0x44, 0xc2, 0x7d, 0xe3, 0xd7, 0x93,
0x0f, 0xdb, 0xc3, 0x2d, 0xe3, 0x8d, 0xbc, 0xbb, 0xd7, 0x71, 0xcf, 0xe2, 0x07, 0x76, 0xaf, 0x29,
0x44, 0xd2, 0x27, 0x80, 0x0f, 0x16, 0xc2, 0x61, 0x06, 0x52, 0xb1, 0x44, 0xb5, 0xbe, 0x95, 0x31,
0xec, 0x83, 0x19, 0x4b, 0xd5, 0x02, 0x3c, 0x67, 0x0d, 0x96, 0x4b, 0x07, 0xe0, 0x32, 0x97, 0x4d,
0x1c, 0x54, 0x32, 0x71, 0xa9, 0x78, 0x33, 0xe3, 0xe4, 0x7e, 0x7c, 0xfe, 0x50, 0xb5, 0x00, 0x2f,
0x59, 0x69, 0xb5, 0xd2, 0x0e, 0xb8, 0x14, 0x9f, 0x92, 0x30, 0xc7, 0xc8, 0x86, 0xf3, 0x16, 0x55,
0xf6, 0xe6, 0x58, 0x65, 0x29, 0x77, 0x1b, 0xd5, 0x02, 0xbc, 0xe0, 0xa5, 0x5c, 0x79, 0x1c, 0x81,
0x2b, 0x63, 0x0e, 0xd7, 0x99, 0xaa, 0xdb, 0x19, 0xed, 0x1a, 0x7f, 0x21, 0x40, 0x1c, 0xfe, 0xee,
0xf8, 0xeb, 0x82, 0x1d, 0xc0, 0x5b, 0x8d, 0xf8, 0x9d, 0xa5, 0xc7, 0x52, 0xa3, 0x8a, 0x77, 0x32,
0x1a, 0x97, 0x92, 0x4e, 0x45, 0x1a, 0x67, 0xa5, 0x64, 0x59, 0xd5, 0xc0, 0xd9, 0x48, 0x07, 0x1d,
0xa5, 0xbb, 0x54, 0xf6, 0xed, 0x4c, 0xd9, 0x84, 0xb8, 0x5a, 0x80, 0x67, 0xac, 0x64, 0x22, 0xd4,
0x36, 0x90, 0x92, 0xd7, 0xab, 0x6c, 0x44, 0x8a, 0xf7, 0x32, 0xf2, 0x20, 0x87, 0xf3, 0x80, 0xa8,
0x37, 0x19, 0xce, 0x0d, 0x1a, 0x12, 0xdd, 0xa7, 0x39, 0x25, 0xc5, 0xfb, 0xb9, 0x45, 0xb3, 0x24,
0x94, 0x41, 0xd1, 0x3c, 0x31, 0x65, 0x48, 0xb4, 0x4d, 0xef, 0x9c, 0x8b, 0xab, 0xb9, 0x45, 0xb3,
0x4b, 0xea, 0x41, 0xd1, 0xfc, 0xe2, 0xba, 0x03, 0x16, 0x93, 0xa2, 0x79, 0xda, 0x07, 0xef, 0x97,
0x37, 0x32, 0xce, 0x05, 0xd2, 0xf3, 0x80, 0xaa, 0x05, 0xb8, 0x60, 0xa5, 0x67, 0x08, 0xa5, 0x6b,
0xe3, 0x5d, 0xf5, 0xe6, 0x0b, 0x6a, 0x8b, 0x3a, 0x6c, 0x44, 0x1b, 0xef, 0xb6, 0x74, 0x6d, 0xbc,
0xf7, 0xde, 0x7a, 0x41, 0x6d, 0x51, 0x1f, 0x8e, 0x68, 0xe3, 0x3d, 0x79, 0x00, 0x96, 0x92, 0xda,
0x68, 0x36, 0x88, 0x4f, 0x56, 0xcb, 0xbe, 0x8f, 0xbd, 0xe2, 0x5a, 0x6e, 0x75, 0xc9, 0x94, 0x98,
0x41, 0x75, 0x03, 0xc9, 0x32, 0xbf, 0x2e, 0x80, 0x52, 0x32, 0x40, 0x48, 0xde, 0x24, 0xc5, 0xc7,
0x2c, 0xc5, 0x07, 0x99, 0x67, 0xb2, 0x99, 0x4f, 0x64, 0xd8, 0x99, 0x6c, 0x44, 0xd6, 0x1e, 0x25,
0x93, 0xf6, 0xc1, 0xe5, 0x94, 0x13, 0x16, 0xec, 0xb4, 0x71, 0xf1, 0xed, 0xcc, 0x10, 0x7b, 0xcc,
0x03, 0x15, 0x16, 0x62, 0x0f, 0x55, 0x3a, 0x6d, 0x3c, 0xac, 0x2c, 0x0c, 0x37, 0x5d, 0x1b, 0x17,
0x1f, 0xe6, 0x56, 0x36, 0xf4, 0x28, 0x64, 0x50, 0x59, 0x5c, 0x29, 0x7d, 0x15, 0x9c, 0x0f, 0xac,
0x3d, 0xbe, 0x0e, 0x61, 0xb2, 0x20, 0x7a, 0xc7, 0xc5, 0xf5, 0x8c, 0xb5, 0x28, 0xed, 0xc2, 0x91,
0xac, 0x45, 0x81, 0xb5, 0x97, 0x2c, 0x97, 0x02, 0xb0, 0xe4, 0xf3, 0xeb, 0x19, 0xe4, 0x51, 0x49,
0x68, 0x0f, 0xd3, 0x83, 0xec, 0x7e, 0x27, 0x28, 0xbe, 0x93, 0x71, 0x24, 0x35, 0xe9, 0x66, 0xa7,
0x5a, 0x80, 0x97, 0xfd, 0xf4, 0xfa, 0xe1, 0x69, 0xc1, 0x53, 0x4c, 0xf8, 0x94, 0x7f, 0x94, 0xdb,
0x4e, 0x93, 0x89, 0x49, 0x83, 0x76, 0x3a, 0x90, 0xb2, 0x94, 0xae, 0x8d, 0x4f, 0xc2, 0x2f, 0xbc,
0xa0, 0xb6, 0xb4, 0x49, 0x38, 0x90, 0x87, 0xb3, 0x03, 0x2e, 0x85, 0x86, 0x71, 0x8c, 0x76, 0x71,
0xd0, 0x7e, 0xce, 0xd7, 0xc0, 0x2f, 0x66, 0xac, 0x48, 0x29, 0xd7, 0x5b, 0x64, 0x45, 0xb2, 0x53,
0x6e, 0xbd, 0xbe, 0x3f, 0x74, 0x9a, 0xc7, 0x0d, 0x30, 0xd6, 0xcb, 0xf6, 0xf8, 0xc5, 0x77, 0x73,
0x1f, 0x9e, 0x8d, 0x7f, 0xdb, 0x3c, 0x78, 0xa4, 0x97, 0x4a, 0x27, 0x7d, 0x6b, 0x68, 0x67, 0xbf,
0xdf, 0xdf, 0xc1, 0xf4, 0x72, 0x76, 0x60, 0x9b, 0xf0, 0x38, 0xf7, 0x01, 0xe7, 0xe8, 0x27, 0x27,
0x06, 0x0f, 0x38, 0x69, 0xfd, 0xfe, 0xc0, 0xf6, 0xe0, 0x3b, 0xe9, 0x5d, 0x62, 0xf5, 0x7a, 0xf4,
0x98, 0x35, 0x3a, 0xe0, 0x7c, 0x2f, 0xf3, 0x84, 0x7b, 0xd2, 0xdb, 0xa5, 0x41, 0x47, 0x94, 0xfa,
0xba, 0xa9, 0x07, 0x96, 0xb9, 0xb5, 0xed, 0x79, 0x56, 0xef, 0x39, 0xdd, 0xd2, 0xf9, 0x6d, 0x2b,
0x8c, 0x84, 0xde, 0xa7, 0xfa, 0xdf, 0xce, 0xb0, 0xb7, 0x91, 0xfb, 0x7a, 0x32, 0x9b, 0xac, 0x44,
0xd5, 0x91, 0x1f, 0x5f, 0xe5, 0xff, 0x80, 0x6d, 0xd4, 0x06, 0xb4, 0xb6, 0x3d, 0xf7, 0xa8, 0x8b,
0x7e, 0x01, 0x1f, 0xe1, 0x0e, 0xb2, 0x9d, 0xdd, 0x5d, 0xba, 0x05, 0x2e, 0x7e, 0x90, 0x69, 0x0f,
0xd9, 0x37, 0xc8, 0xcc, 0x1e, 0x26, 0xd2, 0x49, 0x3f, 0x0f, 0x2e, 0xd1, 0x24, 0x0e, 0x7a, 0x6f,
0x4a, 0xef, 0x3c, 0x79, 0xeb, 0x3f, 0xcc, 0xba, 0xa9, 0x1c, 0xb9, 0x7e, 0xad, 0x16, 0xa0, 0xd4,
0x1f, 0xbd, 0x94, 0x65, 0x07, 0xea, 0xa9, 0xfb, 0x26, 0xdc, 0xe3, 0xca, 0xbe, 0x94, 0x69, 0x6f,
0xe3, 0xd3, 0x97, 0x98, 0xbd, 0x8d, 0xaf, 0xdf, 0x38, 0x09, 0x66, 0xa9, 0xa4, 0x27, 0x33, 0x73,
0x53, 0xe2, 0x34, 0x21, 0x8e, 0xb6, 0x2c, 0xc4, 0x81, 0x86, 0xb7, 0x1b, 0x74, 0x83, 0xba, 0xfa,
0x57, 0xe7, 0xe2, 0xcf, 0x45, 0x85, 0x51, 0xb5, 0x74, 0x03, 0xac, 0x94, 0x35, 0x43, 0xd1, 0x9f,
0xaa, 0x10, 0x41, 0xd5, 0xd0, 0x5b, 0x50, 0x19, 0xfe, 0xd8, 0xc3, 0x15, 0x50, 0x1c, 0x25, 0x31,
0x54, 0xf8, 0x54, 0x85, 0xa2, 0x20, 0x5d, 0x07, 0x57, 0x46, 0x6b, 0xb7, 0x5a, 0x1b, 0x2a, 0x6c,
0xa8, 0xa6, 0x6a, 0x88, 0x53, 0xd2, 0x3b, 0xe0, 0xc1, 0x28, 0x45, 0x59, 0x36, 0xe5, 0x0d, 0xd9,
0x50, 0x51, 0x53, 0x37, 0xcc, 0x0a, 0x54, 0x0d, 0x64, 0xa8, 0xb5, 0x4d, 0x54, 0xd5, 0x0d, 0x53,
0x2d, 0x8b, 0xd3, 0xd2, 0xdb, 0xe0, 0xcd, 0x09, 0x4c, 0xf5, 0x6d, 0xe3, 0xe3, 0xda, 0x00, 0xc7,
0x8c, 0xb4, 0x0e, 0xd6, 0x26, 0x71, 0xe8, 0x8d, 0x8a, 0x5e, 0xde, 0x18, 0xe0, 0x99, 0x95, 0xde,
0x00, 0x77, 0xf3, 0x40, 0x83, 0x65, 0x43, 0x3c, 0x21, 0xdd, 0x03, 0xb7, 0x32, 0x21, 0x11, 0xca,
0x93, 0xd2, 0x1d, 0x50, 0x1a, 0xa5, 0x94, 0x9b, 0xcd, 0x9a, 0xa6, 0xc8, 0xa6, 0xa6, 0x37, 0x50,
0xd5, 0x34, 0x9b, 0xe2, 0x9c, 0x74, 0x1b, 0xdc, 0x98, 0x4c, 0x67, 0x2a, 0x4d, 0xf1, 0x54, 0x3a,
0xd9, 0x33, 0xad, 0x51, 0xd6, 0x9f, 0x19, 0xa8, 0xac, 0x1a, 0x5b, 0xa6, 0xde, 0x14, 0x81, 0xf4,
0x26, 0xb8, 0x37, 0x01, 0x9f, 0xf1, 0x71, 0x8d, 0x8d, 0x19, 0xc5, 0x78, 0x3a, 0xa3, 0x83, 0xe3,
0xa6, 0xab, 0x65, 0xa3, 0xaa, 0x6d, 0x9a, 0xe2, 0x19, 0xe9, 0x11, 0x78, 0x3b, 0x97, 0xfc, 0x64,
0x17, 0x9f, 0xcd, 0xd0, 0x03, 0xd5, 0xb2, 0x36, 0x38, 0xf4, 0xf3, 0x79, 0x07, 0xa5, 0xa2, 0x34,
0xc5, 0x73, 0xb9, 0x06, 0x85, 0x50, 0x8a, 0xb9, 0xbb, 0x87, 0x50, 0x9f, 0x97, 0x3e, 0x00, 0xef,
0xbe, 0x48, 0xf7, 0xf0, 0xf9, 0x50, 0x53, 0x0d, 0x43, 0x94, 0xa4, 0xb7, 0xc0, 0xfd, 0x3c, 0xcc,
0xf2, 0x27, 0x2d, 0xa8, 0x8a, 0x17, 0xa4, 0xbb, 0xe0, 0xe6, 0x04, 0xf2, 0xf2, 0x76, 0x43, 0xae,
0xeb, 0xe5, 0x0d, 0xf1, 0x62, 0x86, 0x89, 0x2b, 0xb2, 0x61, 0xc8, 0x8d, 0x32, 0x94, 0xd1, 0x96,
0xba, 0x6d, 0x34, 0x65, 0x45, 0x35, 0xc4, 0x4b, 0x19, 0xa3, 0x16, 0xf3, 0x24, 0xc7, 0x60, 0x41,
0x7a, 0x0c, 0x1e, 0x4d, 0xe0, 0x52, 0x6b, 0xb2, 0x61, 0x6a, 0x8a, 0xa1, 0xca, 0x50, 0xa9, 0x0e,
0x70, 0x5e, 0xce, 0x35, 0xde, 0x9c, 0x5f, 0x56, 0xaa, 0xaa, 0x58, 0xcc, 0xe8, 0x2d, 0xc6, 0x51,
0x57, 0xeb, 0x3a, 0xdc, 0x2e, 0x6f, 0x88, 0x8b, 0xb9, 0x14, 0xd0, 0x9e, 0x45, 0x4c, 0xc1, 0x52,
0x46, 0x63, 0x18, 0x87, 0x52, 0x6b, 0x19, 0xe6, 0x90, 0xf1, 0x2e, 0x4b, 0xab, 0xe0, 0x4e, 0xa6,
0x75, 0xb1, 0x51, 0xbc, 0x22, 0xad, 0x81, 0xd5, 0x5c, 0xf6, 0xc5, 0xe8, 0x57, 0x32, 0x06, 0x33,
0xa6, 0xaf, 0x6b, 0x0a, 0xd4, 0x0d, 0x7d, 0xd3, 0x14, 0xaf, 0x4a, 0x5f, 0x04, 0xeb, 0x93, 0x06,
0x53, 0x57, 0xb6, 0xa0, 0x2e, 0x2b, 0xd5, 0x21, 0x3f, 0x77, 0x2d, 0xc3, 0xf6, 0x43, 0xdf, 0x28,
0x9b, 0x35, 0xd9, 0x10, 0xaf, 0x67, 0xcc, 0x29, 0xa3, 0xa1, 0x3f, 0xdb, 0xac, 0xc9, 0x5b, 0xaa,
0x78, 0x63, 0x8c, 0x5c, 0x5d, 0x49, 0xf4, 0x6e, 0xd9, 0x40, 0x4d, 0xa8, 0x7f, 0x65, 0x5b, 0x2c,
0x8d, 0x31, 0xc5, 0x24, 0x75, 0x55, 0xab, 0x54, 0x91, 0xfc, 0x54, 0xd6, 0x6a, 0xf2, 0x86, 0x56,
0xd3, 0xcc, 0x6d, 0xf1, 0xa6, 0xf4, 0x2e, 0x78, 0x27, 0x83, 0x8b, 0xce, 0x10, 0x4d, 0x41, 0x50,
0xad, 0x68, 0x86, 0x09, 0xa9, 0xeb, 0x14, 0x6f, 0xa5, 0x7b, 0x61, 0x43, 0xae, 0xd7, 0x92, 0x2e,
0x56, 0xbc, 0x2d, 0x95, 0xc0, 0xd5, 0x51, 0x3a, 0x55, 0x59, 0x67, 0x9f, 0x35, 0x6a, 0x28, 0xaa,
0x78, 0x67, 0x8c, 0xd1, 0xe9, 0xca, 0xb0, 0x1b, 0x46, 0x0d, 0xbd, 0x81, 0xe4, 0xb2, 0x78, 0x57,
0xba, 0x05, 0xae, 0x4f, 0x5a, 0x17, 0xe9, 0xe7, 0x6e, 0xee, 0xa5, 0xdb, 0x7e, 0x72, 0x05, 0x90,
0x9f, 0x19, 0x48, 0xd1, 0x1b, 0x86, 0x5e, 0x53, 0xc5, 0xfb, 0xab, 0x7f, 0x28, 0x80, 0xf9, 0xc1,
0xaf, 0x25, 0x4a, 0xd7, 0xc0, 0x72, 0x24, 0xc1, 0x30, 0x65, 0xb3, 0x65, 0x0c, 0x2d, 0xdf, 0xcb,
0xe0, 0xf2, 0x30, 0x81, 0xd1, 0x52, 0x14, 0xe2, 0xa9, 0x84, 0xd4, 0xca, 0x2d, 0xad, 0xd9, 0x54,
0xcb, 0xe2, 0x94, 0xb4, 0x08, 0x2e, 0x0d, 0x57, 0xaa, 0x10, 0xea, 0x50, 0x9c, 0x4e, 0xe3, 0x93,
0x37, 0x74, 0x48, 0x57, 0xe2, 0xd5, 0x7f, 0x9c, 0x02, 0xd3, 0x8a, 0x29, 0x4b, 0x17, 0xc0, 0x39,
0xc5, 0x94, 0x47, 0xbf, 0x4b, 0x45, 0x0a, 0xe5, 0x96, 0x59, 0x25, 0x0d, 0x6b, 0xa8, 0x8a, 0xa9,
0x93, 0x38, 0xe2, 0x32, 0xb8, 0x40, 0xcb, 0x15, 0x53, 0x7b, 0x4a, 0xc2, 0x0b, 0xc3, 0xd0, 0xf4,
0x06, 0x09, 0x1f, 0xa2, 0x0a, 0x02, 0x19, 0x41, 0xf5, 0xe3, 0x96, 0x6a, 0x98, 0x86, 0x38, 0x1d,
0x56, 0x34, 0xa1, 0x5a, 0xd7, 0x5a, 0x75, 0x64, 0xb4, 0x9a, 0x4d, 0x1d, 0x9a, 0xe2, 0x4c, 0x58,
0x61, 0x42, 0x32, 0xa5, 0xcb, 0xa8, 0xac, 0x3e, 0xd5, 0x88, 0x2f, 0x9c, 0x0d, 0x75, 0xb7, 0x9a,
0x15, 0x28, 0x97, 0x55, 0xb4, 0x21, 0x37, 0x1a, 0x2a, 0x14, 0x4f, 0x84, 0x0c, 0x1b, 0x5a, 0xad,
0xa6, 0x35, 0x2a, 0xc8, 0x68, 0xd5, 0xeb, 0x32, 0xdc, 0x16, 0x4f, 0x86, 0x2d, 0xe0, 0xba, 0x6b,
0x9a, 0x61, 0x8a, 0x73, 0xf4, 0xeb, 0x45, 0x71, 0x61, 0x5d, 0x6f, 0x68, 0xa6, 0x0e, 0xb5, 0x46,
0x45, 0x3c, 0x45, 0xbf, 0x8b, 0x64, 0xca, 0x48, 0xfd, 0x8a, 0xa9, 0xc2, 0x86, 0x5c, 0x43, 0x72,
0xab, 0xac, 0x99, 0xc8, 0x30, 0x75, 0x28, 0x57, 0x54, 0x11, 0x84, 0x00, 0xf4, 0x2d, 0x82, 0xc2,
0x20, 0x7d, 0xb7, 0xdd, 0x50, 0xc4, 0xd3, 0x92, 0x08, 0xce, 0x50, 0xbe, 0x86, 0x09, 0x65, 0xa4,
0x95, 0xc5, 0x33, 0xd2, 0x79, 0x70, 0x36, 0xa2, 0x34, 0x14, 0xad, 0x2e, 0x9e, 0x5d, 0xfd, 0x9b,
0x53, 0xe0, 0x52, 0xea, 0x6b, 0x04, 0xb2, 0x80, 0x68, 0x0d, 0x53, 0xad, 0x30, 0xd3, 0x47, 0x6a,
0x03, 0xea, 0xb5, 0x1a, 0xda, 0xd2, 0x1a, 0xc3, 0x9f, 0x75, 0xba, 0x01, 0x56, 0xc6, 0x11, 0x1a,
0x35, 0x59, 0xd9, 0x12, 0x05, 0x62, 0xb7, 0xe3, 0x48, 0x88, 0x2d, 0xea, 0x5a, 0x59, 0x11, 0xa7,
0x48, 0x48, 0x32, 0x8e, 0xaa, 0x29, 0x57, 0x54, 0x58, 0x6e, 0x99, 0xdb, 0xe2, 0xf4, 0x24, 0x7d,
0x6a, 0x5d, 0xd6, 0x6a, 0xe2, 0x0c, 0x89, 0x1f, 0xc7, 0x91, 0x3c, 0xd1, 0xa0, 0x2c, 0xce, 0x4a,
0x37, 0xc1, 0xb5, 0x71, 0x14, 0xd4, 0x06, 0x61, 0x59, 0x3c, 0x41, 0x26, 0xfb, 0x38, 0xa2, 0xba,
0x6c, 0x9a, 0x2a, 0xac, 0xeb, 0x86, 0x29, 0x9e, 0x9c, 0xd4, 0xbc, 0xba, 0x81, 0x4c, 0x55, 0xae,
0x1b, 0xe2, 0xdc, 0x24, 0x2a, 0xbd, 0x69, 0x54, 0xd4, 0x86, 0xa6, 0x8a, 0xa7, 0x26, 0x41, 0x27,
0xe3, 0x26, 0x82, 0x89, 0x8d, 0x93, 0xeb, 0x9b, 0xe2, 0xe9, 0xc9, 0xb8, 0x95, 0xaa, 0xd6, 0x50,
0x99, 0x3d, 0x7c, 0x01, 0x3c, 0xcc, 0xa6, 0x43, 0x15, 0xcd, 0xac, 0xb6, 0x36, 0xe8, 0x24, 0x22,
0x93, 0xe7, 0xac, 0xf4, 0x00, 0xbc, 0x91, 0x83, 0x4d, 0xd1, 0xa0, 0x52, 0x53, 0x15, 0x4d, 0x9c,
0x27, 0x0e, 0x29, 0x9f, 0x9e, 0x9a, 0xbc, 0x21, 0x9e, 0x23, 0x8b, 0x5e, 0x0e, 0xf2, 0x27, 0x6a,
0x63, 0x4b, 0x6b, 0x18, 0xa2, 0x98, 0x93, 0x5e, 0x6e, 0x18, 0xda, 0x46, 0x4d, 0x15, 0xcf, 0x4f,
0xea, 0x1e, 0xb2, 0x3c, 0x6a, 0x8a, 0xda, 0xd0, 0x9f, 0x89, 0xd2, 0xa4, 0x01, 0x8b, 0x26, 0xd5,
0x05, 0xb2, 0x94, 0x8c, 0xb5, 0x24, 0xd9, 0x94, 0xcb, 0x7a, 0x05, 0x69, 0x0d, 0x45, 0x2b, 0xab,
0x0d, 0x13, 0xd5, 0xe5, 0x86, 0x5c, 0x51, 0xeb, 0x6a, 0xc3, 0x14, 0x2f, 0x92, 0x38, 0x20, 0x0f,
0xec, 0x67, 0x24, 0xe0, 0xca, 0x47, 0x4b, 0xa2, 0xcc, 0x05, 0xb2, 0x7e, 0xe6, 0x91, 0x4b, 0x23,
0x06, 0x1a, 0x5a, 0xe5, 0xa0, 0xa6, 0x91, 0x5f, 0x8d, 0x84, 0xec, 0x45, 0xe9, 0x21, 0x78, 0x2b,
0x07, 0x47, 0x62, 0xb7, 0xb6, 0x38, 0xc9, 0x62, 0xc8, 0xfc, 0xa7, 0x9d, 0xa3, 0x99, 0xdb, 0x48,
0x51, 0x1b, 0xa6, 0x0a, 0xc5, 0xa5, 0x49, 0x43, 0xca, 0xcd, 0x11, 0xaa, 0x4d, 0x9d, 0xbb, 0x4b,
0x71, 0x79, 0xf5, 0xdb, 0x33, 0x29, 0x6e, 0x8c, 0x6c, 0x69, 0xc7, 0xb8, 0x31, 0xc3, 0x54, 0x9b,
0x43, 0x6e, 0x2c, 0x5d, 0x25, 0x25, 0x94, 0x9f, 0x19, 0x9a, 0x12, 0x2e, 0x2c, 0xcc, 0x5b, 0x09,
0xd2, 0x97, 0xc1, 0xfb, 0x93, 0xe9, 0x0d, 0xd5, 0xe4, 0x00, 0x89, 0x8f, 0x47, 0x65, 0x75, 0x53,
0x6e, 0xd5, 0x4c, 0xa4, 0x3f, 0x23, 0xeb, 0xc3, 0x94, 0xf4, 0x25, 0xf0, 0xde, 0x64, 0xfe, 0x56,
0xb3, 0xa6, 0xcb, 0xac, 0x83, 0x68, 0x80, 0x61, 0x34, 0x51, 0x5d, 0x35, 0x65, 0x62, 0x54, 0xe2,
0x34, 0x89, 0xda, 0x26, 0xb3, 0x9b, 0xaa, 0x61, 0x52, 0x2f, 0x1f, 0x02, 0x27, 0x81, 0xc9, 0xcc,
0x18, 0x73, 0xa5, 0x7c, 0xac, 0x67, 0xa1, 0x8c, 0x14, 0xa8, 0xca, 0xa6, 0x8a, 0x12, 0x74, 0xe2,
0xec, 0x24, 0x85, 0xc3, 0x8c, 0x15, 0x2d, 0xdc, 0xbb, 0x88, 0x27, 0xf2, 0x29, 0xa4, 0x1f, 0xee,
0x23, 0xe1, 0xb5, 0x61, 0x54, 0x91, 0xa2, 0x42, 0xe2, 0x55, 0xd3, 0x2d, 0x33, 0x55, 0x21, 0x24,
0x91, 0xcc, 0xdc, 0xea, 0x4f, 0x85, 0xd4, 0x97, 0x63, 0xe1, 0xab, 0xaf, 0xb1, 0x43, 0x4c, 0x43,
0x0d, 0x45, 0x2f, 0x0f, 0x1f, 0x52, 0xa4, 0xcf, 0xba, 0x24, 0x7d, 0x1c, 0xf4, 0xe4, 0xa0, 0x8d,
0x62, 0xa0, 0x7b, 0xe0, 0x56, 0x06, 0x6d, 0x18, 0x12, 0x65, 0x4b, 0x8d, 0x23, 0xa4, 0x8f, 0xc0,
0x49, 0x7e, 0xd9, 0x48, 0x62, 0x8f, 0x4d, 0x55, 0x36, 0x49, 0x87, 0x8e, 0xc4, 0x6d, 0x61, 0xc5,
0x70, 0x24, 0x23, 0xac, 0xfe, 0xbe, 0x00, 0x96, 0x27, 0x3c, 0x05, 0x22, 0x6e, 0x3c, 0x64, 0x86,
0xaa, 0xa2, 0xd7, 0xeb, 0x6a, 0xa3, 0xcc, 0x70, 0xa5, 0xc6, 0x88, 0xab, 0xe0, 0xce, 0x64, 0xf2,
0x86, 0x6e, 0x32, 0x5a, 0x81, 0xb8, 0xe4, 0xc9, 0xb4, 0x65, 0xbd, 0xa1, 0x8a, 0x53, 0x1b, 0x5f,
0xfb, 0xbb, 0x9f, 0x5c, 0x15, 0xfe, 0xfe, 0x27, 0x57, 0x85, 0x7f, 0xfe, 0xc9, 0x55, 0xe1, 0x13,
0x7d, 0xcf, 0x09, 0x9e, 0xf7, 0x77, 0xd6, 0xda, 0xee, 0xc1, 0x83, 0x3d, 0xcf, 0x3a, 0x74, 0x58,
0x32, 0x8a, 0xd5, 0x79, 0x10, 0x7f, 0x70, 0xbf, 0xe7, 0x3c, 0xd8, 0xc3, 0xdd, 0x07, 0xf4, 0xd9,
0xd6, 0x83, 0x3d, 0x77, 0xe8, 0x2b, 0xfe, 0x1f, 0x24, 0xfe, 0x1e, 0x3e, 0xdc, 0x39, 0x41, 0xc9,
0xde, 0xf9, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6f, 0xc8, 0xf2, 0x79, 0xf5, 0x5f, 0x00, 0x00,
// 5883 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5b, 0x6c, 0xdb, 0x4a,
0x7a, 0xbf, 0x28, 0xdb, 0x89, 0x3d, 0x49, 0x1c, 0x86, 0x49, 0x1c, 0xd9, 0x8e, 0x73, 0x51, 0xee,
0x3e, 0xe7, 0x38, 0x27, 0x3e, 0xd9, 0x3d, 0x39, 0x97, 0xdd, 0xf3, 0xa7, 0x29, 0xda, 0x62, 0x2c,
0x89, 0x3a, 0x43, 0x2a, 0x59, 0x9f, 0xc5, 0x62, 0xfe, 0xb4, 0x38, 0xb6, 0x59, 0x4b, 0xa2, 0x96,
0xa4, 0xec, 0x63, 0x14, 0x8b, 0xdd, 0x76, 0xdb, 0x45, 0xd1, 0xdd, 0xed, 0xb6, 0x40, 0xb1, 0x28,
0xb0, 0x40, 0x2f, 0xe8, 0x05, 0x7d, 0x28, 0xd0, 0xa7, 0x62, 0x9f, 0x0a, 0xb4, 0x40, 0x0b, 0xf4,
0xa1, 0x0f, 0x05, 0xda, 0xb7, 0xbe, 0x14, 0xfb, 0xd4, 0xb7, 0x3e, 0xb5, 0x40, 0xbb, 0x2d, 0x5a,
0xcc, 0x85, 0x14, 0x25, 0x51, 0x22, 0x73, 0x9a, 0xd3, 0x05, 0x92, 0x37, 0x73, 0xe6, 0xbb, 0xfc,
0x66, 0xe6, 0x9b, 0x6f, 0xbe, 0x99, 0xf9, 0x46, 0x06, 0x0f, 0x02, 0xdc, 0xc2, 0x5d, 0xd7, 0x0b,
0x1e, 0xf6, 0x7c, 0x6b, 0x1f, 0xe3, 0x23, 0xdc, 0x09, 0xfc, 0x87, 0x47, 0x8f, 0xe2, 0x9f, 0x6b,
0x5d, 0xcf, 0x0d, 0x5c, 0xe9, 0x4a, 0x48, 0xba, 0x16, 0xaf, 0x3b, 0x7a, 0xb4, 0x74, 0x2f, 0x92,
0x61, 0x35, 0x9b, 0xd8, 0xf7, 0x5b, 0x8e, 0x1f, 0x10, 0x11, 0xfd, 0x2f, 0x26, 0xa1, 0xb8, 0x0a,
0xa4, 0x86, 0xb6, 0x61, 0x75, 0x3a, 0xd8, 0x53, 0x5a, 0x4e, 0xf3, 0x50, 0x25, 0x22, 0xa4, 0x4b,
0x60, 0xc6, 0x6a, 0x61, 0x2f, 0x28, 0x08, 0x37, 0x84, 0xfb, 0x73, 0x90, 0x7d, 0x14, 0x37, 0xc1,
0xfd, 0x86, 0xa6, 0x77, 0x76, 0x5d, 0xcb, 0xb3, 0x15, 0xb7, 0xdd, 0x6d, 0xe1, 0x00, 0x6f, 0xb9,
0xa6, 0x5b, 0xb2, 0xfc, 0x03, 0x56, 0xd8, 0x97, 0xb0, 0x04, 0x66, 0x7b, 0x3e, 0xf6, 0x3a, 0x56,
0x1b, 0x73, 0x21, 0xd1, 0x77, 0xf1, 0x0e, 0xb8, 0x15, 0xc9, 0x91, 0x6d, 0x7b, 0xd3, 0xf1, 0xfc,
0x00, 0x62, 0xdf, 0xed, 0x79, 0x4d, 0xdc, 0x17, 0x51, 0x5c, 0x8d, 0xa9, 0x1b, 0x26, 0xab, 0x58,
0x41, 0x1c, 0x70, 0xf1, 0x23, 0x70, 0x33, 0xa2, 0x35, 0x70, 0xa0, 0x78, 0xd8, 0xc6, 0x9d, 0xc0,
0xb1, 0x5a, 0x46, 0x6f, 0xb7, 0xed, 0x04, 0xe9, 0x98, 0xe2, 0x02, 0x3e, 0xee, 0x61, 0x3f, 0x70,
0xdc, 0x4e, 0xc7, 0x72, 0x3c, 0x9c, 0x55, 0xc0, 0x37, 0xc0, 0x9d, 0x48, 0x00, 0xc4, 0xfb, 0x8e,
0x4f, 0x00, 0x1e, 0x58, 0xad, 0x16, 0xee, 0xec, 0x67, 0x15, 0x22, 0x2d, 0x82, 0xd9, 0xf6, 0x9e,
0x85, 0x82, 0x93, 0x2e, 0x2e, 0xe4, 0x69, 0xdd, 0xe9, 0xf6, 0x9e, 0x65, 0x9e, 0x74, 0xb1, 0xb4,
0x02, 0x40, 0xcb, 0xdd, 0x77, 0x3a, 0x68, 0xaf, 0xe5, 0x1e, 0x17, 0xa6, 0x68, 0xe5, 0x1c, 0x2d,
0xd9, 0x6c, 0xb9, 0xc7, 0x0c, 0x3f, 0xc4, 0x4d, 0xf7, 0x08, 0x7b, 0x27, 0x8a, 0x6b, 0x63, 0x5f,
0x71, 0x3b, 0x81, 0xd3, 0xe9, 0xe1, 0x8c, 0x83, 0xf2, 0x01, 0x58, 0x19, 0x11, 0xd0, 0x3d, 0xc9,
0xc8, 0xfc, 0x21, 0xb8, 0x36, 0xc4, 0x5c, 0xf7, 0x9c, 0x4e, 0x90, 0x91, 0xbb, 0x08, 0xc4, 0x92,
0xe3, 0x53, 0xe6, 0x2a, 0x0e, 0x2c, 0xdb, 0x0a, 0x2c, 0x69, 0x1e, 0xe4, 0x1d, 0x9b, 0x53, 0xe6,
0x1d, 0xbb, 0x68, 0x81, 0x42, 0x48, 0x13, 0xda, 0x40, 0x44, 0xab, 0x82, 0x59, 0x8f, 0x97, 0x51,
0x8e, 0xf9, 0xf5, 0x07, 0x6b, 0x63, 0x26, 0xc6, 0xda, 0xb0, 0x10, 0x18, 0xb1, 0x16, 0x0f, 0x81,
0x14, 0xd6, 0x1a, 0x01, 0xee, 0x1a, 0x81, 0x15, 0xf4, 0x7c, 0xe9, 0x23, 0x70, 0xca, 0xa7, 0x7f,
0x71, 0xd1, 0xf7, 0x52, 0x45, 0x33, 0x46, 0xc8, 0xd9, 0xc8, 0x5c, 0xc2, 0x9e, 0xe7, 0x7a, 0x7c,
0x40, 0xd9, 0x47, 0xf1, 0x0f, 0x04, 0xb0, 0xd0, 0xd0, 0x62, 0x2c, 0x5e, 0x80, 0x6d, 0xd6, 0x55,
0x2a, 0x98, 0x6d, 0xf3, 0xa6, 0x51, 0x9d, 0x67, 0x32, 0x34, 0x27, 0xec, 0x0b, 0x18, 0xb1, 0x4a,
0x4a, 0x04, 0x3c, 0x4f, 0x85, 0xbc, 0x91, 0x01, 0x78, 0xd8, 0xea, 0x10, 0x7c, 0xf1, 0xbf, 0x04,
0x70, 0xa3, 0x0f, 0x33, 0xec, 0x34, 0x03, 0xb7, 0x70, 0x93, 0xcc, 0x90, 0x97, 0x0a, 0xb8, 0x1a,
0x1b, 0x46, 0x06, 0xf9, 0x51, 0xe6, 0x61, 0xec, 0x8b, 0x0b, 0x45, 0xc4, 0xda, 0x3f, 0xf5, 0xd9,
0xdb, 0xff, 0xcb, 0x79, 0xe2, 0x84, 0x42, 0x02, 0xad, 0x13, 0xe0, 0x7d, 0xcf, 0x22, 0x2d, 0x97,
0x9f, 0x1b, 0xba, 0x56, 0x52, 0x14, 0xb7, 0xd3, 0xc1, 0xcd, 0xe0, 0x95, 0xef, 0x87, 0x1f, 0xe7,
0xe3, 0x76, 0x50, 0xb2, 0x02, 0x6b, 0xd7, 0xf2, 0x31, 0x2c, 0x19, 0x6a, 0xc7, 0x73, 0x5b, 0xad,
0x57, 0xbd, 0xfd, 0xd2, 0x13, 0x50, 0xf0, 0xa9, 0xd1, 0x63, 0x1b, 0x85, 0x92, 0x7d, 0xd4, 0x74,
0x7b, 0x9d, 0xa0, 0x30, 0x7d, 0x43, 0xb8, 0x3f, 0x05, 0x17, 0xc2, 0xfa, 0x10, 0x8a, 0xaf, 0x90,
0xda, 0xe2, 0xbf, 0x0b, 0xe0, 0x6a, 0xbf, 0xe7, 0xb6, 0x7b, 0xbb, 0x58, 0xdd, 0x7e, 0x4d, 0x7a,
0xad, 0xf8, 0x14, 0x14, 0x1a, 0x9a, 0x62, 0xb5, 0x5a, 0xa6, 0x2b, 0x53, 0x7f, 0x11, 0x5b, 0x10,
0xd6, 0xc0, 0x54, 0x93, 0xb7, 0x78, 0x7e, 0xfd, 0xea, 0x58, 0xe9, 0x8a, 0x29, 0x43, 0x42, 0x58,
0xfc, 0xfe, 0x4c, 0xbc, 0x1f, 0x4b, 0xb8, 0xdb, 0x72, 0x4f, 0x0c, 0xec, 0x1d, 0x39, 0x4d, 0xfc,
0xca, 0x5b, 0xdf, 0x3e, 0x38, 0x67, 0xd3, 0x06, 0xa3, 0x36, 0x0e, 0x0e, 0x5c, 0x9b, 0x9a, 0xdc,
0xfc, 0xfa, 0xc6, 0x58, 0x59, 0x93, 0x3a, 0x6a, 0x8d, 0x15, 0x55, 0xa9, 0x24, 0x78, 0xd6, 0x8e,
0x7d, 0x49, 0x16, 0x38, 0xc3, 0x15, 0xd1, 0x10, 0x64, 0x86, 0xaa, 0xf9, 0x7f, 0xff, 0x1b, 0x35,
0x24, 0x76, 0x81, 0xc0, 0x8e, 0xfe, 0x2e, 0x22, 0x70, 0x36, 0x0e, 0x40, 0x5a, 0x01, 0x8b, 0x25,
0xb5, 0x5e, 0xd1, 0x77, 0x50, 0x55, 0x35, 0xcb, 0x7a, 0x09, 0x35, 0x6a, 0x46, 0x5d, 0x55, 0xb4,
0x4d, 0x4d, 0x2d, 0x89, 0x39, 0x69, 0x01, 0x48, 0x83, 0xd5, 0x72, 0xc3, 0xd4, 0x45, 0x41, 0x2a,
0x80, 0x4b, 0x83, 0xe5, 0x55, 0xb9, 0xd6, 0x90, 0x2b, 0x62, 0xbe, 0x88, 0x01, 0xe8, 0xab, 0x96,
0x96, 0xc1, 0x15, 0x4e, 0x67, 0xee, 0xd4, 0xd5, 0x21, 0xe1, 0xd7, 0xc0, 0x52, 0xbc, 0x52, 0xab,
0x19, 0xa6, 0x5c, 0xa9, 0x20, 0x43, 0x81, 0x5a, 0xdd, 0x14, 0x05, 0x69, 0x09, 0x2c, 0xc4, 0xeb,
0xe5, 0xaa, 0xfc, 0x89, 0x5e, 0x43, 0xaa, 0x62, 0x88, 0xf9, 0xe2, 0x8f, 0xa6, 0xc1, 0xed, 0x7e,
0xfb, 0x15, 0x0f, 0x5b, 0x01, 0x0e, 0xbf, 0x4e, 0x14, 0xb7, 0xb3, 0xe7, 0xec, 0xbf, 0xf2, 0x76,
0xe9, 0x82, 0x73, 0x4d, 0xda, 0xd2, 0x41, 0xbb, 0x7c, 0x9a, 0xc1, 0x60, 0xc6, 0x77, 0xd8, 0x1a,
0xfb, 0x3b, 0xb4, 0xcf, 0x66, 0xec, 0xab, 0xf8, 0x47, 0x02, 0x38, 0x1b, 0xaf, 0x26, 0xd6, 0xa3,
0xe8, 0xb5, 0x4d, 0x6d, 0x2b, 0xd9, 0x7a, 0x46, 0xaa, 0xe5, 0xe7, 0x06, 0x52, 0x95, 0x75, 0x64,
0x18, 0x55, 0x51, 0x20, 0xe3, 0x9f, 0x5c, 0xad, 0x6a, 0x8a, 0x2a, 0xe6, 0x93, 0xd9, 0x61, 0xc9,
0xa0, 0x26, 0x30, 0x25, 0x2d, 0x82, 0xcb, 0x09, 0xec, 0xdb, 0x86, 0x38, 0x5d, 0xfc, 0x4f, 0x01,
0x5c, 0x4f, 0x58, 0x2f, 0xf9, 0xbe, 0xe0, 0x95, 0x77, 0xfc, 0xbf, 0x90, 0x8f, 0x4f, 0x8e, 0xb0,
0xf9, 0x6c, 0xe4, 0x7a, 0x1e, 0xae, 0x9a, 0x15, 0xe3, 0x95, 0xef, 0x83, 0x5f, 0xcb, 0x83, 0x47,
0x71, 0x07, 0xe9, 0x1f, 0x06, 0x6e, 0x97, 0x2c, 0x83, 0x47, 0xb8, 0xe4, 0x78, 0xb8, 0x19, 0xb8,
0xde, 0x89, 0xe9, 0xba, 0x2d, 0x5f, 0xeb, 0xf8, 0x81, 0xf5, 0x1a, 0x44, 0x03, 0xdf, 0xcd, 0x83,
0xb5, 0xb4, 0x0e, 0x89, 0x4c, 0xe4, 0x95, 0xef, 0x8d, 0x3f, 0xc9, 0x83, 0xbb, 0xfd, 0xde, 0x90,
0x7b, 0x81, 0x1b, 0xfe, 0x1d, 0x0b, 0x21, 0x5f, 0xf9, 0x15, 0xe4, 0x1e, 0x38, 0x9f, 0x1c, 0x4e,
0xcf, 0x7b, 0x83, 0x61, 0xf4, 0xb7, 0xf2, 0xe0, 0x56, 0xbf, 0xbb, 0x54, 0x65, 0x9d, 0xce, 0x9a,
0xce, 0xeb, 0xb4, 0x17, 0xfd, 0x37, 0x01, 0x2c, 0x0e, 0x47, 0x5c, 0x64, 0xa1, 0x7a, 0xcd, 0x1a,
0xce, 0x22, 0x87, 0x9a, 0x6b, 0xbf, 0xfa, 0x3e, 0xe2, 0xa7, 0x02, 0xb8, 0x36, 0xdc, 0x70, 0xb9,
0xdb, 0x25, 0x61, 0xf6, 0x6b, 0x10, 0x44, 0x7c, 0x27, 0x0f, 0x1e, 0x4c, 0x08, 0x22, 0x34, 0xb9,
0x5a, 0x77, 0x5b, 0x4e, 0xf3, 0xe4, 0x95, 0xef, 0x88, 0xff, 0x16, 0x40, 0xb1, 0xdf, 0x11, 0x75,
0xcf, 0xe9, 0x34, 0x9d, 0xae, 0xd5, 0xf2, 0x5f, 0x9f, 0xc5, 0xf2, 0x3f, 0x04, 0xb0, 0xd2, 0xef,
0x01, 0x13, 0xfb, 0x01, 0x3f, 0x78, 0x7b, 0x1d, 0xfc, 0xfe, 0xbf, 0x0a, 0xa0, 0x10, 0xf3, 0x02,
0xfc, 0xe2, 0xc5, 0x7e, 0xe5, 0xdb, 0xbd, 0x4c, 0xbc, 0x3e, 0xf7, 0xf6, 0xf8, 0x18, 0xba, 0xad,
0xf8, 0xe5, 0xd0, 0xdf, 0x52, 0x8b, 0x18, 0xa8, 0x35, 0xac, 0xa3, 0xf8, 0x65, 0xc7, 0x2d, 0x70,
0x8e, 0x44, 0x08, 0xb6, 0xe5, 0xd9, 0xa8, 0xe7, 0x63, 0x76, 0x99, 0x30, 0x0b, 0xcf, 0x86, 0x85,
0x0d, 0x1f, 0xdb, 0xd2, 0x32, 0x98, 0x3b, 0xb1, 0xda, 0x2d, 0x46, 0x90, 0xa7, 0x04, 0xb3, 0xa4,
0x80, 0x56, 0xde, 0x05, 0xe7, 0xdb, 0xae, 0x8d, 0xd1, 0xf1, 0x01, 0xee, 0x20, 0xdf, 0x3a, 0xc2,
0x36, 0xbf, 0x77, 0x39, 0x47, 0x8a, 0x9f, 0x1f, 0xe0, 0x0e, 0x51, 0x69, 0x4b, 0x32, 0x58, 0xd9,
0x73, 0x70, 0xcb, 0xf6, 0xd1, 0xb1, 0x13, 0x1c, 0xa0, 0xa6, 0xdb, 0x39, 0xc2, 0x9e, 0xef, 0xb8,
0x1d, 0x44, 0xcf, 0xfa, 0xfd, 0xc2, 0xf4, 0x8d, 0xa9, 0xfb, 0x73, 0x70, 0x89, 0x11, 0x3d, 0x77,
0x82, 0x03, 0x25, 0x22, 0x51, 0x29, 0x45, 0xf1, 0x26, 0xd9, 0x2e, 0x0e, 0xb6, 0x95, 0x04, 0x37,
0xad, 0x58, 0x8b, 0xdf, 0x04, 0xab, 0x43, 0x24, 0xcf, 0x1c, 0x7c, 0x5c, 0x72, 0x9b, 0xbd, 0x36,
0xee, 0x04, 0xd6, 0xe0, 0xf1, 0x5a, 0xf1, 0xcf, 0x04, 0x70, 0x59, 0xf6, 0x7d, 0x87, 0xcc, 0x14,
0x6a, 0x30, 0xd1, 0x4c, 0xb9, 0x07, 0xce, 0x73, 0x84, 0x94, 0x07, 0x45, 0xd7, 0x2c, 0xf3, 0xf1,
0x62, 0xcd, 0x96, 0x6e, 0x82, 0xb3, 0x81, 0x1b, 0x58, 0x2d, 0x14, 0xb8, 0x87, 0xb8, 0xc3, 0xae,
0x11, 0xa6, 0xe0, 0x19, 0x5a, 0x66, 0xd2, 0x22, 0xd2, 0xc7, 0x5d, 0xcf, 0x6d, 0x77, 0x83, 0x90,
0x66, 0x8a, 0xd2, 0x9c, 0x65, 0x85, 0x9c, 0xe8, 0x0d, 0x70, 0xa1, 0x19, 0x61, 0x08, 0x09, 0x59,
0x94, 0x27, 0xf6, 0x2b, 0x18, 0x71, 0xf1, 0xef, 0x05, 0x70, 0x89, 0xe1, 0x56, 0x3f, 0xc5, 0xcd,
0xde, 0x67, 0x80, 0xbd, 0x02, 0x40, 0x87, 0x8c, 0x1a, 0x8b, 0x26, 0x19, 0xe8, 0x39, 0x52, 0x42,
0x03, 0xc9, 0x91, 0x56, 0x4d, 0x65, 0x68, 0xd5, 0x74, 0xd6, 0x56, 0xcd, 0x8c, 0x69, 0xd5, 0x13,
0xb0, 0xc4, 0x1a, 0x55, 0xc3, 0xc7, 0x4a, 0x0c, 0x6e, 0x74, 0x37, 0xd6, 0xb4, 0x02, 0xbc, 0xef,
0x7a, 0x27, 0xe1, 0xdd, 0x58, 0xf8, 0x5d, 0xfc, 0x53, 0x01, 0x5c, 0x64, 0xac, 0x32, 0xbd, 0xba,
0x85, 0xf8, 0xeb, 0x3d, 0xec, 0x53, 0xeb, 0x0e, 0x67, 0x1b, 0x3b, 0xab, 0x63, 0x8c, 0x67, 0xc3,
0x42, 0x7a, 0xf8, 0xf5, 0x33, 0x19, 0xc1, 0x1f, 0x09, 0xe0, 0x6c, 0x88, 0x98, 0x14, 0x4b, 0x0b,
0xe0, 0x94, 0x45, 0xff, 0xe2, 0x18, 0xf9, 0xd7, 0xcf, 0x06, 0xdd, 0x6d, 0x20, 0xb1, 0x8e, 0xac,
0x38, 0x7e, 0x30, 0xf6, 0xb6, 0xf1, 0x9b, 0xa0, 0x10, 0xa7, 0x6a, 0xef, 0xc6, 0x6e, 0x26, 0x25,
0x30, 0x1d, 0xbb, 0xc5, 0xa4, 0x7f, 0x4b, 0x3a, 0x38, 0xdf, 0xa6, 0x54, 0xfe, 0x81, 0xd3, 0x45,
0x87, 0x4e, 0x87, 0x39, 0x93, 0xf9, 0xf5, 0xbb, 0x7d, 0xc7, 0x17, 0xbb, 0x7a, 0x3f, 0x7a, 0xb4,
0x56, 0x8d, 0xc8, 0xb7, 0x9d, 0x8e, 0x0d, 0xe7, 0xdb, 0x03, 0xdf, 0xc5, 0xaf, 0x02, 0xb1, 0x0f,
0x80, 0x4d, 0x7a, 0x69, 0x6b, 0xc4, 0xd5, 0x8f, 0x77, 0xab, 0xa3, 0x6d, 0xec, 0x3b, 0xfb, 0x41,
0xe1, 0x8d, 0xae, 0xfd, 0xf9, 0x09, 0x2f, 0x61, 0xb2, 0x54, 0xbd, 0x3c, 0xe1, 0x7f, 0x2e, 0x80,
0x85, 0xe1, 0x81, 0x79, 0xc9, 0xbd, 0x23, 0x7d, 0x12, 0x8e, 0x25, 0x8a, 0xe4, 0xa5, 0xad, 0x88,
0xe3, 0x6c, 0x25, 0x1c, 0xd6, 0xea, 0x24, 0xfc, 0x2f, 0x79, 0x00, 0xfe, 0xcf, 0xf1, 0xbf, 0xe4,
0x31, 0xfe, 0x5c, 0xf1, 0xff, 0x4e, 0x3e, 0x8e, 0x7f, 0xcb, 0xb3, 0x3a, 0x81, 0x6f, 0xba, 0x0d,
0x1f, 0x7b, 0xd2, 0x1a, 0xb8, 0x48, 0x57, 0x0c, 0xe4, 0xb9, 0x2d, 0xec, 0xa3, 0x7d, 0x52, 0xc7,
0x83, 0x86, 0x19, 0x78, 0x81, 0x56, 0x91, 0x35, 0xd7, 0xdf, 0x62, 0x15, 0x64, 0xd1, 0x67, 0xf4,
0x4e, 0xe7, 0x00, 0x7b, 0x0e, 0xbd, 0x18, 0x1c, 0xe0, 0x9c, 0xa2, 0x9c, 0x4b, 0x94, 0x48, 0x0b,
0x69, 0x06, 0x44, 0xbc, 0x0d, 0x2e, 0x31, 0x11, 0x81, 0x67, 0x39, 0x41, 0x9f, 0x33, 0x4f, 0x39,
0x25, 0x5a, 0x67, 0xd2, 0xaa, 0x90, 0x43, 0x01, 0xd7, 0x86, 0x95, 0x0e, 0xf1, 0x4e, 0x53, 0xde,
0xe5, 0x41, 0xad, 0x83, 0x42, 0x96, 0xc1, 0x5c, 0xcf, 0xc7, 0x1e, 0xa2, 0x5e, 0x6c, 0xa6, 0x9f,
0x8b, 0x51, 0xb3, 0xda, 0xb8, 0xf8, 0xc3, 0xa9, 0x78, 0x0f, 0x41, 0x7c, 0xe4, 0xe0, 0xe3, 0x97,
0x3d, 0xc3, 0x9e, 0x80, 0x45, 0xdb, 0x3a, 0xf1, 0x51, 0xd7, 0xf2, 0x03, 0xd4, 0xc1, 0x9f, 0x06,
0xc8, 0xea, 0xd9, 0x4e, 0x80, 0xc8, 0x3c, 0xe0, 0x8d, 0xbf, 0x4c, 0x08, 0xea, 0x16, 0x59, 0x30,
0x3f, 0x0d, 0x64, 0x52, 0x5b, 0x22, 0x10, 0x36, 0xc1, 0xf5, 0x98, 0x9f, 0xf5, 0xf0, 0xd7, 0x7b,
0x8e, 0x87, 0x49, 0xf8, 0xe3, 0xa3, 0xe6, 0x81, 0xd5, 0xd9, 0xe7, 0xdd, 0x3e, 0x0b, 0x57, 0xfa,
0x64, 0x30, 0x46, 0xa5, 0x30, 0x22, 0xe9, 0x09, 0x28, 0x78, 0xb4, 0x69, 0x68, 0x8f, 0x08, 0xc1,
0x9d, 0xe6, 0x49, 0x24, 0x60, 0x9a, 0x0a, 0x58, 0x60, 0xf5, 0x9b, 0x61, 0x75, 0xc8, 0xf9, 0x21,
0x58, 0xe6, 0x9c, 0xb6, 0x75, 0x82, 0xdc, 0x3d, 0xd4, 0x76, 0x3b, 0x24, 0xe6, 0xe3, 0xcc, 0x33,
0x94, 0xf9, 0x0a, 0x23, 0x29, 0x59, 0x27, 0xfa, 0x5e, 0x95, 0xd4, 0x87, 0xdc, 0xef, 0x81, 0xc5,
0x4e, 0x8f, 0xda, 0xb6, 0xbb, 0x87, 0x3c, 0xdc, 0x76, 0x8f, 0xb0, 0x8d, 0x38, 0xd4, 0xc2, 0x29,
0xda, 0xf2, 0x05, 0x46, 0xa0, 0xef, 0x41, 0x56, 0xcd, 0x17, 0x8a, 0xe2, 0x6f, 0x0a, 0xa3, 0x03,
0xf3, 0xb2, 0xa7, 0xde, 0x23, 0x70, 0x99, 0xad, 0x52, 0x88, 0x2c, 0x53, 0x88, 0x37, 0xd4, 0xb1,
0x79, 0xea, 0x8a, 0x64, 0x0d, 0xe9, 0xd7, 0xec, 0xe2, 0xf7, 0x04, 0xb0, 0x18, 0x4b, 0x8b, 0x60,
0x17, 0xdb, 0xe3, 0xd6, 0x55, 0x69, 0x03, 0x4c, 0xc7, 0x16, 0xc7, 0xb5, 0xb1, 0x28, 0x47, 0x24,
0xd2, 0x45, 0x92, 0xf2, 0x0e, 0x9a, 0xef, 0xd4, 0x90, 0xf9, 0xba, 0x64, 0x57, 0x30, 0xc2, 0x4d,
0xd3, 0x6b, 0x58, 0xac, 0x55, 0x1b, 0xe9, 0xab, 0xf5, 0xec, 0x28, 0x12, 0x56, 0x24, 0x0f, 0xdc,
0x48, 0x50, 0x18, 0x6e, 0xd2, 0x3e, 0x1f, 0x9d, 0xdf, 0x00, 0xcb, 0x09, 0x4d, 0x8c, 0x32, 0x96,
0xca, 0x60, 0xba, 0xe9, 0xda, 0x61, 0x2a, 0xd4, 0xe3, 0xec, 0xaa, 0x18, 0xbf, 0xe2, 0xda, 0x18,
0x52, 0x09, 0x63, 0x52, 0x97, 0xbe, 0x95, 0x07, 0x57, 0x13, 0x3b, 0x19, 0x77, 0x3f, 0x97, 0xf6,
0x12, 0xab, 0xf1, 0x03, 0xdc, 0x7d, 0x71, 0xab, 0x21, 0x90, 0x20, 0xe5, 0x95, 0x2a, 0x43, 0x3b,
0xd2, 0xc7, 0x2f, 0x26, 0x65, 0x68, 0x6b, 0xfa, 0x8f, 0x02, 0xb8, 0x18, 0x65, 0x2c, 0x52, 0xef,
0x18, 0xed, 0x39, 0xd3, 0xa3, 0xf2, 0xd8, 0x99, 0x37, 0x72, 0x3d, 0x67, 0xdf, 0xe9, 0xf0, 0xfe,
0x8d, 0xce, 0xbc, 0x75, 0x5a, 0x2a, 0xdd, 0x01, 0xf3, 0xcd, 0x96, 0xdb, 0xb3, 0x51, 0xd7, 0x73,
0x8f, 0x1c, 0x1b, 0x7b, 0xe1, 0xf6, 0x93, 0x96, 0xd6, 0x79, 0xa1, 0xa4, 0x83, 0x59, 0x9b, 0x1f,
0x8e, 0x51, 0xe7, 0x75, 0x66, 0xfd, 0x9d, 0xd4, 0xed, 0x36, 0xb6, 0xc3, 0xf3, 0xb4, 0x7e, 0x7f,
0x87, 0x42, 0x8a, 0xcf, 0xc0, 0xd2, 0x78, 0x3a, 0xe9, 0x0a, 0x38, 0x6d, 0xef, 0xc6, 0x5b, 0x77,
0xca, 0xde, 0xa5, 0xed, 0xba, 0x0e, 0xce, 0xd8, 0xbb, 0x88, 0xa6, 0x95, 0x36, 0xdd, 0x16, 0x6f,
0x13, 0xb0, 0x77, 0xeb, 0xbc, 0xa4, 0xf8, 0x2f, 0x02, 0x58, 0xda, 0xc4, 0x56, 0xd0, 0xf3, 0x30,
0xc4, 0x4d, 0xb7, 0xdd, 0xc6, 0x1d, 0x3b, 0xb6, 0x0d, 0x1a, 0x98, 0xd8, 0xc2, 0xe0, 0xc4, 0x96,
0xde, 0x07, 0xa7, 0xf7, 0x18, 0x2b, 0x37, 0x83, 0x1b, 0x63, 0xdb, 0x18, 0xaa, 0x08, 0x19, 0xa4,
0x4f, 0xc1, 0x0a, 0xff, 0x13, 0x79, 0x03, 0x7a, 0x51, 0xcc, 0x24, 0x26, 0xcd, 0x94, 0x44, 0xd0,
0xdc, 0x24, 0x96, 0xf7, 0xc6, 0x57, 0x16, 0x8f, 0xc1, 0x25, 0x53, 0xde, 0x62, 0x3b, 0x59, 0xfc,
0x71, 0x0f, 0x7b, 0xfc, 0xb0, 0xf2, 0x3a, 0x60, 0xdb, 0x1c, 0x44, 0xf6, 0xa5, 0x2c, 0xb3, 0x70,
0x0a, 0x02, 0x5a, 0x54, 0x23, 0x25, 0x7d, 0x02, 0x6c, 0xef, 0xe3, 0x70, 0x6b, 0xc4, 0x08, 0x54,
0x52, 0x42, 0x76, 0xb9, 0x8e, 0x8f, 0xfc, 0x1e, 0xf5, 0xc8, 0x7c, 0xd1, 0x9b, 0x73, 0x7c, 0x83,
0x15, 0x14, 0xff, 0x79, 0x0a, 0x5c, 0x61, 0xae, 0x7e, 0xcb, 0xb3, 0xba, 0x07, 0xf2, 0x73, 0xc3,
0x68, 0x5a, 0x9d, 0x30, 0xf3, 0xe6, 0x22, 0x97, 0xdd, 0x5c, 0x47, 0x0e, 0xbf, 0x46, 0x61, 0x20,
0xa6, 0xe1, 0x05, 0xa6, 0xa3, 0x19, 0xdd, 0xaf, 0xc4, 0xb0, 0x90, 0xc1, 0x60, 0x58, 0xa6, 0x39,
0x16, 0x12, 0x39, 0xf9, 0xfd, 0x8d, 0xdc, 0xbe, 0xe7, 0xf6, 0xba, 0x0c, 0xcd, 0x34, 0xdf, 0xc8,
0x6d, 0xd1, 0xa2, 0xbe, 0x0c, 0x1a, 0x23, 0x51, 0x33, 0x0d, 0x65, 0xd0, 0x90, 0x88, 0xd8, 0x3a,
0x23, 0xe8, 0xba, 0x2d, 0xa7, 0xe9, 0x60, 0xb6, 0x97, 0x9e, 0x86, 0xe7, 0x68, 0x69, 0x9d, 0x17,
0x4a, 0x6f, 0x02, 0x89, 0x63, 0x3f, 0xf4, 0x51, 0xb3, 0xd5, 0xf3, 0x83, 0x70, 0xe5, 0x9c, 0x86,
0x22, 0x83, 0x7e, 0xe8, 0x2b, 0xbc, 0xbc, 0xdf, 0x52, 0xcf, 0xf6, 0x63, 0x2d, 0x3d, 0x1d, 0x6b,
0x29, 0xb4, 0xfd, 0x7e, 0x4b, 0xef, 0x03, 0x26, 0x03, 0xf9, 0xef, 0xa0, 0xdd, 0x5e, 0xf3, 0x10,
0x07, 0x7e, 0x61, 0x96, 0x12, 0x33, 0x70, 0xc6, 0x3b, 0x1b, 0xac, 0x94, 0x84, 0x6e, 0x9c, 0xd2,
0x6a, 0xb7, 0xa2, 0xf9, 0xe9, 0x17, 0xe6, 0x28, 0x35, 0xc3, 0x68, 0x58, 0xed, 0x56, 0x38, 0x49,
0x63, 0x1c, 0xae, 0x63, 0x37, 0x63, 0x1c, 0x20, 0xc6, 0xa1, 0x3b, 0x76, 0xb3, 0xcf, 0x11, 0x75,
0x89, 0xd5, 0xa4, 0xe1, 0x9c, 0x5f, 0x38, 0x13, 0xeb, 0x12, 0x99, 0x17, 0x16, 0x7f, 0x28, 0x80,
0xdb, 0x0d, 0x2d, 0x36, 0xd8, 0x8a, 0xe7, 0x1e, 0x77, 0x9e, 0xe2, 0x63, 0xdc, 0x2a, 0x39, 0x7b,
0x7b, 0xcf, 0x1c, 0x7c, 0xcc, 0xc6, 0xfd, 0x09, 0x28, 0x58, 0x7b, 0x7b, 0x83, 0x39, 0x6c, 0x28,
0x96, 0x36, 0x3b, 0x07, 0x17, 0xc2, 0xfa, 0x28, 0xd1, 0x93, 0x1d, 0xe7, 0x3d, 0x06, 0x0b, 0xa3,
0x9c, 0xb1, 0x24, 0xe5, 0x4b, 0xc3, 0x7c, 0x34, 0xd3, 0x67, 0x13, 0x5c, 0x35, 0x70, 0xb3, 0xe7,
0x39, 0xc1, 0x09, 0xa4, 0xd3, 0x6a, 0x0b, 0x07, 0x10, 0xfb, 0xbd, 0x16, 0x5f, 0x8a, 0x93, 0x36,
0xd2, 0x12, 0x98, 0x26, 0x91, 0x1f, 0x8f, 0x02, 0xe9, 0xdf, 0x45, 0x0b, 0x5c, 0x8c, 0xf2, 0x44,
0x36, 0x71, 0xd0, 0x3c, 0x60, 0xec, 0xa3, 0xde, 0x51, 0x48, 0xf2, 0x8e, 0x23, 0x2e, 0x39, 0x3f,
0xea, 0x92, 0x8b, 0x3f, 0x10, 0x80, 0x44, 0x6c, 0xd9, 0xb4, 0xfc, 0x43, 0x32, 0x75, 0x71, 0xe4,
0x91, 0x02, 0xcb, 0x3f, 0x8c, 0x3b, 0xbb, 0x59, 0x52, 0x10, 0x26, 0x64, 0x3b, 0xbe, 0xdf, 0x1b,
0x90, 0x3a, 0x47, 0x4b, 0x68, 0xf5, 0x25, 0x30, 0x43, 0xbc, 0x4b, 0x18, 0xa2, 0xb0, 0x0f, 0xe2,
0xfb, 0x23, 0x3b, 0x8c, 0xdd, 0x77, 0xce, 0xc0, 0xf9, 0xa8, 0x98, 0xdd, 0x77, 0xfe, 0xf5, 0x07,
0xe0, 0x7c, 0x83, 0x78, 0x21, 0x8a, 0x44, 0xef, 0x60, 0x7d, 0x4f, 0x6a, 0x80, 0xf3, 0x3d, 0x07,
0xed, 0xd2, 0x64, 0x7d, 0xd4, 0x6c, 0x39, 0xcd, 0xc3, 0xd4, 0x70, 0x6f, 0x34, 0xb7, 0xbf, 0x9c,
0x83, 0xe7, 0x7a, 0x4e, 0xac, 0x54, 0xfa, 0x91, 0x00, 0x1e, 0xf4, 0x1c, 0xe4, 0xb2, 0xdc, 0x75,
0xc4, 0x8f, 0x4c, 0x30, 0xda, 0x77, 0x51, 0xe0, 0x22, 0x3b, 0x4c, 0xee, 0xe7, 0x1a, 0xd9, 0xf2,
0x29, 0x4f, 0xd0, 0x98, 0xed, 0x85, 0x40, 0x39, 0x07, 0x6f, 0xf5, 0x9c, 0x54, 0x5a, 0xe9, 0xbb,
0x02, 0xb8, 0x15, 0x43, 0x67, 0xd9, 0x36, 0xda, 0x73, 0x3c, 0x1a, 0x9d, 0xf2, 0x51, 0x65, 0xb8,
0xd8, 0xca, 0xf7, 0x61, 0x3a, 0xae, 0xf1, 0x2f, 0x0e, 0xca, 0x39, 0x78, 0x2d, 0x82, 0x94, 0x48,
0x36, 0xdc, 0x57, 0x09, 0x68, 0x5a, 0x56, 0x10, 0x8d, 0xce, 0x4c, 0xd6, 0xbe, 0x4a, 0x79, 0xde,
0x30, 0xd0, 0x57, 0xe3, 0x69, 0xa5, 0x5f, 0x12, 0xc0, 0x8d, 0x18, 0x3a, 0x1f, 0x07, 0xa8, 0x19,
0xbd, 0x84, 0x40, 0x3e, 0x7d, 0x84, 0x40, 0x9d, 0xe5, 0x99, 0xf5, 0xf7, 0xd3, 0x41, 0x8d, 0x7b,
0x47, 0x51, 0xce, 0xc1, 0xab, 0x11, 0x9a, 0x04, 0x22, 0xe9, 0xd7, 0x05, 0x70, 0x3b, 0x06, 0xc3,
0xe3, 0x59, 0x4f, 0x64, 0x93, 0xc4, 0x9e, 0x43, 0x84, 0x50, 0x4e, 0x53, 0x28, 0x5f, 0x4e, 0x87,
0x32, 0xe9, 0x41, 0x45, 0x39, 0x07, 0x6f, 0x44, 0x70, 0xc6, 0x10, 0x86, 0x3d, 0xe3, 0xf1, 0x27,
0x0a, 0x88, 0x84, 0xb7, 0x64, 0x02, 0xb2, 0x27, 0x12, 0x7c, 0xb8, 0x66, 0x53, 0x7b, 0x26, 0xe5,
0x81, 0x05, 0xeb, 0x99, 0xf1, 0x44, 0xd2, 0xa7, 0xe0, 0x6a, 0x12, 0x8a, 0xee, 0x09, 0x47, 0x30,
0x47, 0x11, 0x7c, 0x31, 0x3b, 0x82, 0xf8, 0x0b, 0x8d, 0x72, 0x0e, 0x16, 0x46, 0xb4, 0x73, 0x02,
0xe9, 0xe7, 0xc1, 0xca, 0xa8, 0xe6, 0xae, 0xe7, 0x74, 0x02, 0xae, 0x1a, 0x50, 0xd5, 0xef, 0x66,
0x55, 0x3d, 0xf4, 0xbe, 0xa3, 0x9c, 0x83, 0x8b, 0x43, 0xba, 0xfb, 0x14, 0x52, 0x0b, 0x2c, 0xf6,
0x1c, 0x64, 0x73, 0x27, 0x4e, 0xa2, 0x2e, 0x8f, 0x2c, 0x25, 0x54, 0x38, 0x5d, 0xd4, 0xce, 0xac,
0x3f, 0xcc, 0x90, 0x33, 0x18, 0x7f, 0x25, 0x51, 0xce, 0xc1, 0x85, 0x9e, 0x93, 0xf8, 0x7e, 0xe2,
0xbb, 0xcc, 0xfc, 0x22, 0x75, 0xfd, 0xb5, 0x2e, 0x4c, 0x15, 0xe1, 0x9a, 0xcf, 0x52, 0xcd, 0xef,
0x65, 0xd0, 0x9c, 0xfc, 0xf0, 0x81, 0x59, 0x5e, 0xca, 0xe3, 0x88, 0x6f, 0x52, 0xc3, 0x8b, 0xc0,
0xf0, 0xf4, 0x5a, 0x9f, 0x65, 0xca, 0x72, 0x20, 0xe7, 0x28, 0x90, 0x2f, 0x7c, 0xa6, 0x3c, 0x5b,
0x66, 0x73, 0x13, 0xf2, 0xa2, 0x7f, 0x85, 0x39, 0xd0, 0x3e, 0x02, 0x1e, 0xd0, 0xf7, 0xe7, 0x25,
0x03, 0x31, 0x4f, 0x41, 0x3c, 0xc9, 0x02, 0x22, 0x29, 0x9d, 0xb1, 0x9c, 0x83, 0xd7, 0x63, 0x38,
0x12, 0x33, 0x1e, 0x7f, 0x8b, 0x79, 0xcf, 0x51, 0x28, 0xcd, 0xf0, 0x26, 0x1b, 0xb5, 0x83, 0x96,
0xcf, 0x01, 0x9d, 0xa7, 0x80, 0xbe, 0xf4, 0x02, 0x80, 0x46, 0x13, 0x0c, 0xcb, 0x39, 0x78, 0x7b,
0x14, 0x55, 0x9f, 0x2e, 0x68, 0xf1, 0x1c, 0xab, 0xbf, 0x14, 0xc0, 0x93, 0xc1, 0x71, 0xa2, 0xe9,
0x69, 0xc8, 0xa2, 0xf9, 0x69, 0xc8, 0x0e, 0x13, 0xd4, 0x50, 0xe0, 0xba, 0x2d, 0x1e, 0x4c, 0xb6,
0x5a, 0x1c, 0xa9, 0x48, 0x91, 0x3e, 0xcd, 0x34, 0x7e, 0x99, 0xd2, 0x00, 0xcb, 0x39, 0xf8, 0x28,
0x3e, 0xa8, 0xd9, 0x72, 0x07, 0x7f, 0x2c, 0x80, 0xc7, 0x99, 0xda, 0xd0, 0xef, 0x6e, 0x86, 0xff,
0x02, 0xc5, 0xbf, 0xf5, 0x99, 0xf1, 0x0f, 0x26, 0x22, 0x94, 0x73, 0x70, 0x2d, 0x0d, 0xfc, 0x50,
0xea, 0xc2, 0x6f, 0x0b, 0xe0, 0x8d, 0x38, 0x72, 0xab, 0x47, 0x22, 0x8f, 0x68, 0x0f, 0x1a, 0x7b,
0x72, 0xc1, 0x00, 0x4b, 0x14, 0xf0, 0x47, 0x19, 0x00, 0x4f, 0x4a, 0xac, 0x2b, 0xe7, 0xe0, 0xdd,
0x3e, 0xd0, 0x89, 0x29, 0x78, 0x7f, 0x2c, 0x80, 0x87, 0x29, 0x96, 0xeb, 0x58, 0x6d, 0xb6, 0x79,
0x39, 0xe1, 0x20, 0x2f, 0x52, 0x90, 0x1b, 0x9f, 0xc5, 0x7e, 0x07, 0x73, 0x5b, 0xca, 0x39, 0xf8,
0x60, 0x82, 0x11, 0x6b, 0x56, 0x3b, 0x9e, 0x08, 0xf3, 0x1b, 0x02, 0xb8, 0x1b, 0x87, 0xda, 0x8d,
0xf2, 0x45, 0x46, 0xc6, 0xfd, 0x12, 0x45, 0xf8, 0x41, 0x06, 0x84, 0xe3, 0x92, 0x4e, 0xca, 0x39,
0x58, 0xec, 0x43, 0x1b, 0x9b, 0x9a, 0xf2, 0x8b, 0x02, 0xb8, 0x19, 0xc7, 0x14, 0x60, 0x3f, 0x20,
0x68, 0x3a, 0x03, 0xfe, 0xf8, 0x72, 0xea, 0xea, 0x37, 0x21, 0x03, 0xa4, 0x9c, 0x83, 0x2b, 0x7d,
0x24, 0x49, 0x29, 0x22, 0x1e, 0x58, 0x8e, 0x63, 0x08, 0xe3, 0xdc, 0x70, 0x1d, 0x5a, 0x48, 0xb9,
0x64, 0x18, 0x97, 0x82, 0xc1, 0x96, 0xdd, 0x31, 0xe9, 0x19, 0x2d, 0x50, 0xe8, 0x39, 0x24, 0x08,
0xb3, 0x02, 0x8c, 0x3a, 0xf8, 0x98, 0xee, 0x7f, 0xf9, 0x8a, 0x7b, 0x25, 0xe5, 0x68, 0x6c, 0x6c,
0xf2, 0x43, 0x39, 0x07, 0x2f, 0xf5, 0x9c, 0xd1, 0x4a, 0xe9, 0x84, 0x2e, 0xf2, 0xc3, 0xda, 0x7c,
0xeb, 0x28, 0x54, 0x59, 0x48, 0xed, 0xe1, 0x09, 0x19, 0x15, 0xac, 0xa1, 0xc9, 0x04, 0xd2, 0x37,
0xc1, 0xf5, 0xa4, 0x86, 0xd2, 0x24, 0x06, 0xae, 0x7c, 0x31, 0x75, 0x81, 0x99, 0x98, 0x00, 0x51,
0xce, 0xc1, 0xa5, 0xe1, 0x56, 0xf7, 0x49, 0xa4, 0xdf, 0x63, 0x2e, 0x64, 0x18, 0x01, 0x3b, 0xaa,
0x8f, 0x27, 0x49, 0x70, 0x34, 0x4b, 0x14, 0x8d, 0x92, 0x15, 0xcd, 0x84, 0x5c, 0x8b, 0x72, 0x0e,
0xde, 0x19, 0x02, 0x96, 0x4c, 0x2d, 0xfd, 0xa1, 0x00, 0xd6, 0xe2, 0x26, 0xe8, 0xf4, 0x8f, 0x1a,
0x91, 0x75, 0xec, 0xb3, 0xa3, 0x01, 0x3e, 0x2d, 0xb8, 0x55, 0x2e, 0xa7, 0x6e, 0x21, 0xb2, 0x3d,
0x4e, 0x2c, 0xe7, 0xe0, 0xfd, 0xbe, 0x95, 0xc6, 0x69, 0x8f, 0x7d, 0xdd, 0xb1, 0x9b, 0x03, 0x0f,
0x19, 0xbf, 0x27, 0x80, 0x3b, 0xc9, 0x21, 0x83, 0xed, 0x23, 0x4c, 0x0f, 0x45, 0x39, 0xbc, 0xab,
0x99, 0x43, 0xa8, 0xe4, 0x37, 0x83, 0x83, 0x21, 0x54, 0x44, 0x63, 0xfb, 0xf1, 0x17, 0x72, 0x01,
0x33, 0x6b, 0xb2, 0xde, 0x06, 0x2e, 0x62, 0xd9, 0x03, 0x6c, 0x14, 0x39, 0x8a, 0x95, 0xd4, 0xa9,
0x9b, 0xfc, 0x08, 0x8d, 0x5b, 0x74, 0xf2, 0x03, 0xb5, 0xaf, 0x81, 0x0b, 0x16, 0x4d, 0x63, 0x40,
0xfd, 0x24, 0x82, 0xc2, 0x35, 0xaa, 0x69, 0xfc, 0x11, 0x74, 0x62, 0xca, 0x4d, 0x39, 0x07, 0x45,
0x6b, 0xa8, 0x22, 0x74, 0x89, 0x71, 0x13, 0xe0, 0x3d, 0x4b, 0xc3, 0x63, 0xde, 0xb2, 0xeb, 0xa9,
0x13, 0x76, 0xc2, 0x65, 0x07, 0x73, 0x89, 0x93, 0x6e, 0x43, 0x78, 0xa8, 0x9c, 0x00, 0x22, 0x3a,
0x05, 0x60, 0x38, 0x6e, 0xa4, 0x8e, 0xf3, 0xe4, 0x3b, 0x10, 0x36, 0xce, 0x29, 0xf7, 0x24, 0xdf,
0x16, 0xa8, 0x13, 0x09, 0xf7, 0x8d, 0x5f, 0x8f, 0x3f, 0xc3, 0x0f, 0xb7, 0x8c, 0x37, 0xb3, 0xee,
0x5e, 0xc7, 0x3d, 0xe2, 0x1f, 0xd8, 0xbd, 0x26, 0x10, 0x49, 0x9f, 0x00, 0x3e, 0x58, 0x08, 0x87,
0x19, 0x48, 0x85, 0x22, 0xd5, 0xfa, 0x56, 0xca, 0xb0, 0x0f, 0x66, 0x2c, 0x95, 0x73, 0xf0, 0xbc,
0x35, 0x58, 0x2e, 0xb5, 0xc1, 0x15, 0x2e, 0x9b, 0x38, 0xa8, 0x78, 0xe2, 0x52, 0xe1, 0x56, 0xca,
0xc9, 0xfd, 0xf8, 0xfc, 0xa1, 0x72, 0x0e, 0x5e, 0xb6, 0x92, 0x6a, 0xa5, 0x5d, 0x70, 0xb9, 0x7f,
0x4a, 0xc2, 0x1c, 0x23, 0x1b, 0xce, 0xdb, 0x54, 0xd9, 0x9b, 0x63, 0x95, 0x25, 0xdc, 0x6d, 0x94,
0x73, 0xf0, 0xa2, 0x97, 0x70, 0xe5, 0x71, 0x0c, 0xae, 0x8e, 0x39, 0x5c, 0x67, 0xaa, 0xee, 0xa4,
0xb4, 0x6b, 0xfc, 0x85, 0x00, 0x71, 0xf8, 0x7b, 0xe3, 0xaf, 0x0b, 0x76, 0x01, 0x6f, 0x35, 0xe2,
0x77, 0x96, 0x1e, 0x4b, 0x8d, 0x2a, 0xdc, 0x4d, 0x69, 0x5c, 0x42, 0x3a, 0x15, 0x69, 0x9c, 0x95,
0x90, 0x65, 0x55, 0x01, 0xe7, 0x22, 0x1d, 0x74, 0x94, 0xee, 0x51, 0xd9, 0x77, 0x52, 0x65, 0x13,
0xe2, 0x72, 0x0e, 0x9e, 0xb5, 0xe2, 0x89, 0x50, 0x3b, 0x40, 0x8a, 0x5f, 0xaf, 0xb2, 0x11, 0x29,
0xdc, 0x4f, 0xc9, 0xda, 0x1c, 0xce, 0x03, 0xa2, 0xde, 0x64, 0x38, 0x37, 0x68, 0x48, 0x74, 0x8f,
0xe6, 0x94, 0x14, 0x1e, 0x64, 0x16, 0xcd, 0x92, 0x50, 0x06, 0x45, 0xf3, 0xc4, 0x94, 0x21, 0xd1,
0x36, 0xbd, 0x73, 0x2e, 0xac, 0x66, 0x16, 0xcd, 0x2e, 0xa9, 0x07, 0x45, 0xf3, 0x8b, 0xeb, 0x16,
0x58, 0x8c, 0x8b, 0xe6, 0x69, 0x1f, 0xbc, 0x5f, 0xde, 0x48, 0x39, 0x17, 0x48, 0xce, 0x03, 0x2a,
0xe7, 0xe0, 0x82, 0x95, 0x9c, 0x21, 0x94, 0xac, 0x8d, 0x77, 0xd5, 0x9b, 0x2f, 0xa8, 0x2d, 0xea,
0xb0, 0x11, 0x6d, 0xbc, 0xdb, 0x92, 0xb5, 0xf1, 0xde, 0x7b, 0xeb, 0x05, 0xb5, 0x45, 0x7d, 0x38,
0xa2, 0x8d, 0xf7, 0x64, 0x1b, 0x2c, 0xc5, 0xb5, 0xd1, 0x6c, 0x10, 0x9f, 0xac, 0x96, 0x3d, 0x1f,
0x7b, 0x85, 0xb5, 0xcc, 0xea, 0xe2, 0x29, 0x31, 0x83, 0xea, 0x06, 0x92, 0x65, 0x7e, 0x55, 0x00,
0xc5, 0x78, 0x80, 0x10, 0xbf, 0x49, 0xea, 0x1f, 0xb3, 0x14, 0x1e, 0xa6, 0x9e, 0xc9, 0xa6, 0x3e,
0xe8, 0x61, 0x67, 0xb2, 0x11, 0x59, 0x73, 0x94, 0x4c, 0x3a, 0x04, 0x57, 0x12, 0x4e, 0x58, 0xb0,
0xd3, 0xc4, 0x85, 0xb7, 0x53, 0x43, 0xec, 0x31, 0xcf, 0x69, 0x58, 0x88, 0x3d, 0x54, 0xe9, 0x34,
0xf1, 0xb0, 0xb2, 0x30, 0xdc, 0x74, 0x6d, 0x5c, 0x78, 0x94, 0x59, 0xd9, 0xd0, 0x13, 0x96, 0x41,
0x65, 0xfd, 0x4a, 0xe9, 0xab, 0xe0, 0x42, 0x60, 0xed, 0xf3, 0x75, 0x08, 0x93, 0x05, 0xd1, 0x3b,
0x29, 0xac, 0xa7, 0xac, 0x45, 0x49, 0x17, 0x8e, 0x64, 0x2d, 0x0a, 0xac, 0xfd, 0x78, 0xb9, 0x14,
0x80, 0x25, 0x9f, 0x5f, 0xcf, 0x20, 0x8f, 0x4a, 0x42, 0xfb, 0x98, 0x1e, 0x64, 0xf7, 0x5a, 0x41,
0xe1, 0x9d, 0x94, 0x23, 0xa9, 0x49, 0x37, 0x3b, 0xe5, 0x1c, 0xbc, 0xe2, 0x27, 0xd7, 0x0f, 0x4f,
0x0b, 0x9e, 0x62, 0xc2, 0xa7, 0xfc, 0xe3, 0xcc, 0x76, 0x1a, 0x4f, 0x4c, 0x1a, 0xb4, 0xd3, 0x81,
0x94, 0xa5, 0x64, 0x6d, 0x7c, 0x12, 0x7e, 0xe1, 0x05, 0xb5, 0x25, 0x4d, 0xc2, 0x81, 0x3c, 0x9c,
0x5d, 0x70, 0x39, 0x34, 0x8c, 0x13, 0xb4, 0x87, 0x83, 0xe6, 0x01, 0x5f, 0x03, 0xbf, 0x98, 0xb2,
0x22, 0x25, 0x5c, 0x6f, 0x91, 0x15, 0xc9, 0x4e, 0xb8, 0xf5, 0xfa, 0xfe, 0xd0, 0x69, 0x1e, 0x37,
0xc0, 0xbe, 0x5e, 0xb6, 0xc7, 0x2f, 0xbc, 0x9b, 0xf9, 0xf0, 0x6c, 0xfc, 0x4b, 0xec, 0xc1, 0x23,
0xbd, 0x44, 0x3a, 0xe9, 0x5b, 0x43, 0x3b, 0xfb, 0xc3, 0xde, 0x2e, 0xa6, 0x97, 0xb3, 0x03, 0xdb,
0x84, 0x27, 0x99, 0x0f, 0x38, 0x47, 0x7f, 0x20, 0x63, 0xf0, 0x80, 0x93, 0xd6, 0x1f, 0x0e, 0x6c,
0x0f, 0xbe, 0x93, 0xdc, 0x25, 0x56, 0xb7, 0x4b, 0x8f, 0x59, 0xa3, 0x03, 0xce, 0xf7, 0x52, 0x4f,
0xb8, 0x27, 0xbd, 0xb4, 0x1a, 0x74, 0x44, 0x89, 0x6f, 0xb1, 0xba, 0x60, 0x99, 0x5b, 0xdb, 0xbe,
0x67, 0x75, 0x0f, 0xe8, 0x96, 0xce, 0x6f, 0x5a, 0x61, 0x24, 0xf4, 0x3e, 0xd5, 0xff, 0x76, 0x8a,
0xbd, 0x8d, 0xdc, 0xd7, 0x93, 0xd9, 0x64, 0xc5, 0xaa, 0x8e, 0xfd, 0xfe, 0x55, 0xfe, 0x0f, 0xd8,
0x46, 0x6d, 0x40, 0x6b, 0xd3, 0x73, 0x8f, 0x3b, 0xe8, 0xe7, 0xf0, 0x31, 0x6e, 0x21, 0xdb, 0xd9,
0xdb, 0xa3, 0x5b, 0xe0, 0xc2, 0x07, 0xa9, 0xf6, 0x90, 0x7e, 0x83, 0xcc, 0xec, 0x61, 0x22, 0x9d,
0xf4, 0xff, 0xc1, 0x65, 0x9a, 0xc4, 0x41, 0xef, 0x4d, 0xe9, 0x9d, 0x27, 0x6f, 0xfd, 0x87, 0x69,
0x37, 0x95, 0x23, 0xd7, 0xaf, 0xe5, 0x1c, 0x94, 0x7a, 0xa3, 0x97, 0xb2, 0xec, 0x40, 0x3d, 0x71,
0xdf, 0x84, 0xbb, 0x5c, 0xd9, 0x97, 0x52, 0xed, 0x6d, 0x7c, 0xfa, 0x12, 0xb3, 0xb7, 0xf1, 0xf5,
0x1b, 0xa7, 0xc1, 0x0c, 0x95, 0xf4, 0x74, 0x7a, 0x36, 0x2f, 0x4e, 0x11, 0xe2, 0x68, 0xcb, 0x42,
0x1c, 0x68, 0x78, 0xbb, 0x41, 0x37, 0xa8, 0xab, 0x7f, 0x71, 0xbe, 0xff, 0xe3, 0x56, 0x61, 0x54,
0x2d, 0xdd, 0x04, 0x2b, 0x25, 0xcd, 0x50, 0xf4, 0x67, 0x2a, 0x44, 0x50, 0x35, 0xf4, 0x06, 0x54,
0x86, 0x7f, 0x9a, 0xe2, 0x2a, 0x28, 0x8c, 0x92, 0x18, 0x2a, 0x7c, 0xa6, 0x42, 0x51, 0x90, 0x6e,
0x80, 0xab, 0xa3, 0xb5, 0xdb, 0x8d, 0x0d, 0x15, 0xd6, 0x54, 0x53, 0x35, 0xc4, 0xbc, 0xf4, 0x0e,
0x78, 0x38, 0x4a, 0x51, 0x92, 0x4d, 0x79, 0x43, 0x36, 0x54, 0x54, 0xd7, 0x0d, 0x73, 0x0b, 0xaa,
0x06, 0x32, 0xd4, 0xca, 0x26, 0x2a, 0xeb, 0x86, 0xa9, 0x96, 0xc4, 0x29, 0xe9, 0x6d, 0xf0, 0xe6,
0x04, 0xa6, 0xea, 0x8e, 0xf1, 0x71, 0x65, 0x80, 0x63, 0x5a, 0x5a, 0x07, 0x6b, 0x93, 0x38, 0xf4,
0xda, 0x96, 0x5e, 0xda, 0x18, 0xe0, 0x99, 0x91, 0xde, 0x00, 0xf7, 0xb2, 0x40, 0x83, 0x25, 0x43,
0x3c, 0x25, 0xdd, 0x07, 0xb7, 0x53, 0x21, 0x11, 0xca, 0xd3, 0xd2, 0x5d, 0x50, 0x1c, 0xa5, 0x94,
0xeb, 0xf5, 0x8a, 0xa6, 0xc8, 0xa6, 0xa6, 0xd7, 0x50, 0xd9, 0x34, 0xeb, 0xe2, 0xac, 0x74, 0x07,
0xdc, 0x9c, 0x4c, 0x67, 0x2a, 0x75, 0x71, 0x2e, 0x99, 0xec, 0xb9, 0x56, 0x2b, 0xe9, 0xcf, 0x0d,
0x54, 0x52, 0x8d, 0x6d, 0x53, 0xaf, 0x8b, 0x40, 0x7a, 0x13, 0xdc, 0x9f, 0x80, 0xcf, 0xf8, 0xb8,
0xc2, 0xc6, 0x8c, 0x62, 0x3c, 0x93, 0xd2, 0xc1, 0xfd, 0xa6, 0xab, 0x25, 0xa3, 0xac, 0x6d, 0x9a,
0xe2, 0x59, 0xe9, 0x31, 0x78, 0x3b, 0x93, 0xfc, 0x78, 0x17, 0x9f, 0x4b, 0xd1, 0x03, 0xd5, 0x92,
0x36, 0x38, 0xf4, 0xf3, 0x59, 0x07, 0x65, 0x4b, 0xa9, 0x8b, 0xe7, 0x33, 0x0d, 0x0a, 0xa1, 0x14,
0x33, 0x77, 0x0f, 0xa1, 0xbe, 0x20, 0x7d, 0x00, 0xde, 0x7d, 0x91, 0xee, 0xe1, 0xf3, 0xa1, 0xa2,
0x1a, 0x86, 0x28, 0x49, 0x6f, 0x81, 0x07, 0x59, 0x98, 0xe5, 0x4f, 0x1a, 0x50, 0x15, 0x2f, 0x4a,
0xf7, 0xc0, 0xad, 0x09, 0xe4, 0xa5, 0x9d, 0x9a, 0x5c, 0xd5, 0x4b, 0x1b, 0xe2, 0xa5, 0x14, 0x13,
0x57, 0x64, 0xc3, 0x90, 0x6b, 0x25, 0x28, 0xa3, 0x6d, 0x75, 0xc7, 0xa8, 0xcb, 0x8a, 0x6a, 0x88,
0x97, 0x53, 0x46, 0xad, 0xcf, 0x13, 0x1f, 0x83, 0x05, 0xe9, 0x09, 0x78, 0x3c, 0x81, 0x4b, 0xad,
0xc8, 0x86, 0xa9, 0x29, 0x86, 0x2a, 0x43, 0xa5, 0x3c, 0xc0, 0x79, 0x25, 0xd3, 0x78, 0x73, 0x7e,
0x59, 0x29, 0xab, 0x62, 0x21, 0xa5, 0xb7, 0x18, 0x47, 0x55, 0xad, 0xea, 0x70, 0xa7, 0xb4, 0x21,
0x2e, 0x66, 0x52, 0x40, 0x7b, 0x16, 0x31, 0x05, 0x4b, 0x29, 0x8d, 0x61, 0x1c, 0x4a, 0xa5, 0x61,
0x98, 0x43, 0xc6, 0xbb, 0x2c, 0xad, 0x82, 0xbb, 0xa9, 0xd6, 0xc5, 0x46, 0xf1, 0xaa, 0xb4, 0x06,
0x56, 0x33, 0xd9, 0x17, 0xa3, 0x5f, 0x49, 0x19, 0xcc, 0x3e, 0x7d, 0x55, 0x53, 0xa0, 0x6e, 0xe8,
0x9b, 0xa6, 0x78, 0x4d, 0xfa, 0x22, 0x58, 0x9f, 0x34, 0x98, 0xba, 0xb2, 0x0d, 0x75, 0x59, 0x29,
0x0f, 0xf9, 0xb9, 0xeb, 0x29, 0xb6, 0x1f, 0xfa, 0x46, 0xd9, 0xac, 0xc8, 0x86, 0x78, 0x23, 0x65,
0x4e, 0x19, 0x35, 0xfd, 0xf9, 0x66, 0x45, 0xde, 0x56, 0xc5, 0x9b, 0x63, 0xe4, 0xea, 0x4a, 0xac,
0x77, 0x4b, 0x06, 0xaa, 0x43, 0xfd, 0x2b, 0x3b, 0x62, 0x71, 0x8c, 0x29, 0xc6, 0xa9, 0xcb, 0xda,
0x56, 0x19, 0xc9, 0xcf, 0x64, 0xad, 0x22, 0x6f, 0x68, 0x15, 0xcd, 0xdc, 0x11, 0x6f, 0x49, 0xef,
0x82, 0x77, 0x52, 0xb8, 0xe8, 0x0c, 0xd1, 0x14, 0x04, 0xd5, 0x2d, 0xcd, 0x30, 0x21, 0x75, 0x9d,
0xe2, 0xed, 0x64, 0x2f, 0x6c, 0xc8, 0xd5, 0x4a, 0xdc, 0xc5, 0x8a, 0x77, 0xa4, 0x22, 0xb8, 0x36,
0x4a, 0xa7, 0x2a, 0xeb, 0xec, 0x47, 0x98, 0x6a, 0x8a, 0x2a, 0xde, 0x1d, 0x63, 0x74, 0xba, 0x32,
0xec, 0x86, 0x51, 0x4d, 0xaf, 0x21, 0xb9, 0x24, 0xde, 0x93, 0x6e, 0x83, 0x1b, 0x93, 0xd6, 0x45,
0xfa, 0xe3, 0x3c, 0xf7, 0x93, 0x6d, 0x3f, 0xbe, 0x02, 0xc8, 0xcf, 0x0d, 0xa4, 0xe8, 0x35, 0x43,
0xaf, 0xa8, 0xe2, 0x83, 0xd5, 0xdf, 0x17, 0xc0, 0xfc, 0xe0, 0x6f, 0x3b, 0x4a, 0xd7, 0xc1, 0x72,
0x24, 0xc1, 0x30, 0x65, 0xb3, 0x61, 0x0c, 0x2d, 0xdf, 0xcb, 0xe0, 0xca, 0x30, 0x81, 0xd1, 0x50,
0x14, 0xe2, 0xa9, 0x84, 0xc4, 0xca, 0x6d, 0xad, 0x5e, 0x57, 0x4b, 0x62, 0x5e, 0x5a, 0x04, 0x97,
0x87, 0x2b, 0x55, 0x08, 0x75, 0x28, 0x4e, 0x25, 0xf1, 0xc9, 0x1b, 0x3a, 0xa4, 0x2b, 0xf1, 0xea,
0x3f, 0xe4, 0xc1, 0x94, 0x62, 0xca, 0xd2, 0x45, 0x70, 0x5e, 0x31, 0xe5, 0xd1, 0x5f, 0xd1, 0x22,
0x85, 0x72, 0xc3, 0x2c, 0x93, 0x86, 0xd5, 0x54, 0xc5, 0xd4, 0x49, 0x1c, 0x71, 0x05, 0x5c, 0xa4,
0xe5, 0x8a, 0xa9, 0x3d, 0x23, 0xe1, 0x85, 0x61, 0x68, 0x7a, 0x8d, 0x84, 0x0f, 0x51, 0x05, 0x81,
0x8c, 0xa0, 0xfa, 0x71, 0x43, 0x35, 0x4c, 0x43, 0x9c, 0x0a, 0x2b, 0xea, 0x50, 0xad, 0x6a, 0x8d,
0x2a, 0x32, 0x1a, 0xf5, 0xba, 0x0e, 0x4d, 0x71, 0x3a, 0xac, 0x30, 0x21, 0x99, 0xd2, 0x25, 0x54,
0x52, 0x9f, 0x69, 0xc4, 0x17, 0xce, 0x84, 0xba, 0x1b, 0xf5, 0x2d, 0x28, 0x97, 0x54, 0xb4, 0x21,
0xd7, 0x6a, 0x2a, 0x14, 0x4f, 0x85, 0x0c, 0x1b, 0x5a, 0xa5, 0xa2, 0xd5, 0xb6, 0x90, 0xd1, 0xa8,
0x56, 0x65, 0xb8, 0x23, 0x9e, 0x0e, 0x5b, 0xc0, 0x75, 0x57, 0x34, 0xc3, 0x14, 0x67, 0xe9, 0x6f,
0x2d, 0xf5, 0x0b, 0xab, 0x7a, 0x4d, 0x33, 0x75, 0xa8, 0xd5, 0xb6, 0xc4, 0x39, 0xfa, 0x2b, 0x4e,
0xa6, 0x8c, 0xd4, 0xaf, 0x98, 0x2a, 0xac, 0xc9, 0x15, 0x24, 0x37, 0x4a, 0x9a, 0x89, 0x0c, 0x53,
0x87, 0xf2, 0x96, 0x2a, 0x82, 0x10, 0x80, 0xbe, 0x4d, 0x50, 0x18, 0xa4, 0xef, 0x76, 0x6a, 0x8a,
0x78, 0x46, 0x12, 0xc1, 0x59, 0xca, 0x57, 0x33, 0xa1, 0x8c, 0xb4, 0x92, 0x78, 0x56, 0xba, 0x00,
0xce, 0x45, 0x94, 0x86, 0xa2, 0x55, 0xc5, 0x73, 0xab, 0x7f, 0x35, 0x07, 0x2e, 0x27, 0xbe, 0x46,
0x20, 0x0b, 0x88, 0x56, 0x33, 0xd5, 0x2d, 0x66, 0xfa, 0x48, 0xad, 0x41, 0xbd, 0x52, 0x41, 0xdb,
0x5a, 0x6d, 0xf8, 0x47, 0xa8, 0x6e, 0x82, 0x95, 0x71, 0x84, 0x46, 0x45, 0x56, 0xb6, 0x45, 0x81,
0xd8, 0xed, 0x38, 0x12, 0x62, 0x8b, 0xba, 0x56, 0x52, 0xc4, 0x3c, 0x09, 0x49, 0xc6, 0x51, 0xd5,
0xe5, 0x2d, 0x15, 0x96, 0x1a, 0xe6, 0x8e, 0x38, 0x35, 0x49, 0x9f, 0x5a, 0x95, 0xb5, 0x8a, 0x38,
0x4d, 0xe2, 0xc7, 0x71, 0x24, 0x4f, 0x35, 0x28, 0x8b, 0x33, 0xd2, 0x2d, 0x70, 0x7d, 0x1c, 0x05,
0xb5, 0x41, 0x58, 0x12, 0x4f, 0x91, 0xc9, 0x3e, 0x8e, 0xa8, 0x2a, 0x9b, 0xa6, 0x0a, 0xab, 0xba,
0x61, 0x8a, 0xa7, 0x27, 0x35, 0xaf, 0x6a, 0x20, 0x53, 0x95, 0xab, 0x86, 0x38, 0x3b, 0x89, 0x4a,
0xaf, 0x1b, 0x5b, 0x6a, 0x4d, 0x53, 0xc5, 0xb9, 0x49, 0xd0, 0xc9, 0xb8, 0x89, 0x60, 0x62, 0xe3,
0xe4, 0xea, 0xa6, 0x78, 0x66, 0x32, 0x6e, 0xa5, 0xac, 0xd5, 0x54, 0x66, 0x0f, 0x5f, 0x00, 0x8f,
0xd2, 0xe9, 0xd0, 0x96, 0x66, 0x96, 0x1b, 0x1b, 0x74, 0x12, 0x91, 0xc9, 0x73, 0x4e, 0x7a, 0x08,
0xde, 0xc8, 0xc0, 0xa6, 0x68, 0x50, 0xa9, 0xa8, 0x8a, 0x26, 0xce, 0x13, 0x87, 0x94, 0x4d, 0x4f,
0x45, 0xde, 0x10, 0xcf, 0x93, 0x45, 0x2f, 0x03, 0xf9, 0x53, 0xb5, 0xb6, 0xad, 0xd5, 0x0c, 0x51,
0xcc, 0x48, 0x2f, 0xd7, 0x0c, 0x6d, 0xa3, 0xa2, 0x8a, 0x17, 0x26, 0x75, 0x0f, 0x59, 0x1e, 0x35,
0x45, 0xad, 0xe9, 0xcf, 0x45, 0x69, 0xd2, 0x80, 0x45, 0x93, 0xea, 0x22, 0x59, 0x4a, 0xc6, 0x5a,
0x92, 0x6c, 0xca, 0x25, 0x7d, 0x0b, 0x69, 0x35, 0x45, 0x2b, 0xa9, 0x35, 0x13, 0x55, 0xe5, 0x9a,
0xbc, 0xa5, 0x56, 0xd5, 0x9a, 0x29, 0x5e, 0x22, 0x71, 0x40, 0x16, 0xd8, 0xcf, 0x49, 0xc0, 0x95,
0x8d, 0x96, 0x44, 0x99, 0x0b, 0x64, 0xfd, 0xcc, 0x22, 0x97, 0x46, 0x0c, 0x34, 0xb4, 0xca, 0x40,
0x4d, 0x23, 0xbf, 0x0a, 0x09, 0xd9, 0x0b, 0xd2, 0x23, 0xf0, 0x56, 0x06, 0x8e, 0xd8, 0x6e, 0x6d,
0x71, 0x92, 0xc5, 0x90, 0xf9, 0x4f, 0x3b, 0x47, 0x33, 0x77, 0x90, 0xa2, 0xd6, 0x4c, 0x15, 0x8a,
0x4b, 0x93, 0x86, 0x94, 0x9b, 0x23, 0x54, 0xeb, 0x3a, 0x77, 0x97, 0xe2, 0xf2, 0xea, 0xb7, 0xa7,
0x13, 0xdc, 0x18, 0xd9, 0xd2, 0x8e, 0x71, 0x63, 0x86, 0xa9, 0xd6, 0x87, 0xdc, 0x58, 0xb2, 0x4a,
0x4a, 0x28, 0x3f, 0x37, 0x34, 0x25, 0x5c, 0x58, 0x98, 0xb7, 0x12, 0xa4, 0x2f, 0x83, 0xf7, 0x27,
0xd3, 0x1b, 0xaa, 0xc9, 0x01, 0x12, 0x1f, 0x8f, 0x4a, 0xea, 0xa6, 0xdc, 0xa8, 0x98, 0x48, 0x7f,
0x4e, 0xd6, 0x87, 0xbc, 0xf4, 0x25, 0xf0, 0xde, 0x64, 0xfe, 0x46, 0xbd, 0xa2, 0xcb, 0xac, 0x83,
0x68, 0x80, 0x61, 0xd4, 0x51, 0x55, 0x35, 0x65, 0x62, 0x54, 0xe2, 0x14, 0x89, 0xda, 0x26, 0xb3,
0x9b, 0xaa, 0x61, 0x52, 0x2f, 0x1f, 0x02, 0x27, 0x81, 0xc9, 0xf4, 0x18, 0x73, 0xa5, 0x7c, 0xac,
0x67, 0xa1, 0x8c, 0x14, 0xa8, 0xca, 0xa6, 0x8a, 0x62, 0x74, 0xe2, 0xcc, 0x24, 0x85, 0xc3, 0x8c,
0x5b, 0x5a, 0xb8, 0x77, 0x11, 0x4f, 0x65, 0x53, 0x48, 0x7f, 0x66, 0x90, 0x84, 0xd7, 0x86, 0x51,
0x46, 0x8a, 0x0a, 0x89, 0x57, 0x4d, 0xb6, 0xcc, 0x44, 0x85, 0x90, 0x44, 0x32, 0xb3, 0xab, 0x3f,
0x15, 0x12, 0x5f, 0x8e, 0x85, 0xaf, 0xbe, 0xc6, 0x0e, 0x31, 0x0d, 0x35, 0x14, 0xbd, 0x34, 0x7c,
0x48, 0x91, 0x3c, 0xeb, 0xe2, 0xf4, 0xfd, 0xa0, 0x27, 0x03, 0x6d, 0x14, 0x03, 0xdd, 0x07, 0xb7,
0x53, 0x68, 0xc3, 0x90, 0x28, 0x5d, 0x6a, 0x3f, 0x42, 0xfa, 0x08, 0x9c, 0xe6, 0x97, 0x8d, 0x24,
0xf6, 0xd8, 0x54, 0x65, 0x93, 0x74, 0xe8, 0x48, 0xdc, 0x16, 0x56, 0x0c, 0x47, 0x32, 0xc2, 0xea,
0xef, 0x0a, 0x60, 0x79, 0xc2, 0x53, 0x20, 0xe2, 0xc6, 0x43, 0x66, 0xa8, 0x2a, 0x7a, 0xb5, 0xaa,
0xd6, 0x4a, 0x0c, 0x57, 0x62, 0x8c, 0xb8, 0x0a, 0xee, 0x4e, 0x26, 0xaf, 0xe9, 0x26, 0xa3, 0x15,
0x88, 0x4b, 0x9e, 0x4c, 0x5b, 0xd2, 0x6b, 0xaa, 0x98, 0xdf, 0xf8, 0xda, 0xdf, 0xfc, 0xe4, 0x9a,
0xf0, 0x77, 0x3f, 0xb9, 0x26, 0xfc, 0xd3, 0x4f, 0xae, 0x09, 0x9f, 0xe8, 0xfb, 0x4e, 0x70, 0xd0,
0xdb, 0x5d, 0x6b, 0xba, 0xed, 0x87, 0xfb, 0x9e, 0x75, 0xe4, 0xb0, 0x64, 0x14, 0xab, 0xf5, 0xb0,
0xff, 0xef, 0x01, 0xba, 0xce, 0xc3, 0x7d, 0xdc, 0x79, 0x48, 0x9f, 0x6d, 0x3d, 0xdc, 0x77, 0x87,
0xfe, 0xe7, 0xc0, 0x07, 0xb1, 0xcf, 0xa3, 0x47, 0xbb, 0xa7, 0x28, 0xd9, 0x3b, 0xff, 0x13, 0x00,
0x00, 0xff, 0xff, 0x98, 0x19, 0xa3, 0x10, 0xa3, 0x60, 0x00, 0x00,
}
func (m *UIBannerClickEvent) Marshal() (dAtA []byte, err error) {
@@ -7966,6 +8005,42 @@ func (m *UICreateNewRoleSaveClickEvent) MarshalToSizedBuffer(dAtA []byte) (int,
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if len(m.FieldsWithConversionErrors) > 0 {
for iNdEx := len(m.FieldsWithConversionErrors) - 1; iNdEx >= 0; iNdEx-- {
i -= len(m.FieldsWithConversionErrors[iNdEx])
copy(dAtA[i:], m.FieldsWithConversionErrors[iNdEx])
i = encodeVarintUsageevents(dAtA, i, uint64(len(m.FieldsWithConversionErrors[iNdEx])))
i--
dAtA[i] = 0x22
}
}
if len(m.ModeWhenSaved) > 0 {
i -= len(m.ModeWhenSaved)
copy(dAtA[i:], m.ModeWhenSaved)
i = encodeVarintUsageevents(dAtA, i, uint64(len(m.ModeWhenSaved)))
i--
dAtA[i] = 0x1a
}
if m.YamlUsed {
i--
if m.YamlUsed {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x10
}
if m.StandardUsed {
i--
if m.StandardUsed {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x8
}
return len(dAtA) - i, nil
}
@@ -11580,6 +11655,22 @@ func (m *UICreateNewRoleSaveClickEvent) Size() (n int) {
}
var l int
_ = l
if m.StandardUsed {
n += 2
}
if m.YamlUsed {
n += 2
}
l = len(m.ModeWhenSaved)
if l > 0 {
n += 1 + l + sovUsageevents(uint64(l))
}
if len(m.FieldsWithConversionErrors) > 0 {
for _, s := range m.FieldsWithConversionErrors {
l = len(s)
n += 1 + l + sovUsageevents(uint64(l))
}
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -17486,6 +17577,110 @@ func (m *UICreateNewRoleSaveClickEvent) Unmarshal(dAtA []byte) error {
return fmt.Errorf("proto: UICreateNewRoleSaveClickEvent: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field StandardUsed", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowUsageevents
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.StandardUsed = bool(v != 0)
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field YamlUsed", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowUsageevents
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.YamlUsed = bool(v != 0)
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ModeWhenSaved", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowUsageevents
}
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 ErrInvalidLengthUsageevents
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthUsageevents
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.ModeWhenSaved = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field FieldsWithConversionErrors", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowUsageevents
}
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 ErrInvalidLengthUsageevents
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthUsageevents
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.FieldsWithConversionErrors = append(m.FieldsWithConversionErrors, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipUsageevents(dAtA[iNdEx:])
@@ -409,7 +409,12 @@ message UIDiscoverCompletedEvent {
message UICreateNewRoleClickEvent {}
// UICreateNewRoleSaveClickEvent is an event that can be triggered during custom role creation
message UICreateNewRoleSaveClickEvent {}
message UICreateNewRoleSaveClickEvent {
bool standard_used = 1;
bool yaml_used = 2;
string mode_when_saved = 3;
repeated string fields_with_conversion_errors = 4;
}
// UICreateNewRoleCancelClickEvent is an event that can be triggered during custom role creation
message UICreateNewRoleCancelClickEvent {}
+52 -5
View File
@@ -4521,9 +4521,24 @@ func (x *UICreateNewRoleClickEvent) GetUserName() string {
type UICreateNewRoleSaveClickEvent struct {
state protoimpl.MessageState `protogen:"open.v1"`
// anonymized
UserName string `protobuf:"bytes,1,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
UserName string `protobuf:"bytes,1,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`
// StandardUsed indicates if the user interacted with the standard editor
// tab.
StandardUsed bool `protobuf:"varint,2,opt,name=standard_used,json=standardUsed,proto3" json:"standard_used,omitempty"`
// YamlUsed indicates if the user interacted with the YAML editor tab.
YamlUsed bool `protobuf:"varint,3,opt,name=yaml_used,json=yamlUsed,proto3" json:"yaml_used,omitempty"`
// ModeWhenSaved indicates which editor tab was active when the Save button
// was clicked ("standard" or "yaml"). Note that it's inherently different
// from what `StandardUsed` or `YamlUsed` describe; the user can interact
// with one kind of editor, then verify the results in another, and
// ultimately click Save on any of them.
ModeWhenSaved string `protobuf:"bytes,4,opt,name=mode_when_saved,json=modeWhenSaved,proto3" json:"mode_when_saved,omitempty"`
// A list of field paths that prevented the standard editor from being
// operational, if any. Looking at these may provide insight into which
// missing features should be implemented first.
FieldsWithConversionErrors []string `protobuf:"bytes,5,rep,name=fields_with_conversion_errors,json=fieldsWithConversionErrors,proto3" json:"fields_with_conversion_errors,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UICreateNewRoleSaveClickEvent) Reset() {
@@ -4563,6 +4578,34 @@ func (x *UICreateNewRoleSaveClickEvent) GetUserName() string {
return ""
}
func (x *UICreateNewRoleSaveClickEvent) GetStandardUsed() bool {
if x != nil {
return x.StandardUsed
}
return false
}
func (x *UICreateNewRoleSaveClickEvent) GetYamlUsed() bool {
if x != nil {
return x.YamlUsed
}
return false
}
func (x *UICreateNewRoleSaveClickEvent) GetModeWhenSaved() string {
if x != nil {
return x.ModeWhenSaved
}
return ""
}
func (x *UICreateNewRoleSaveClickEvent) GetFieldsWithConversionErrors() []string {
if x != nil {
return x.FieldsWithConversionErrors
}
return nil
}
// UICreateNewRoleCancelClickEvent is an event that can be triggered during custom role creation
type UICreateNewRoleCancelClickEvent struct {
state protoimpl.MessageState `protogen:"open.v1"`
@@ -10154,9 +10197,13 @@ const file_prehog_v1alpha_teleport_proto_rawDesc = "" +
"\tuser_name\x18\x04 \x01(\tR\buserName\x12&\n" +
"\x0fbot_instance_id\x18\x05 \x01(\tR\rbotInstanceId\"8\n" +
"\x19UICreateNewRoleClickEvent\x12\x1b\n" +
"\tuser_name\x18\x01 \x01(\tR\buserName\"<\n" +
"\tuser_name\x18\x01 \x01(\tR\buserName\"\xe9\x01\n" +
"\x1dUICreateNewRoleSaveClickEvent\x12\x1b\n" +
"\tuser_name\x18\x01 \x01(\tR\buserName\">\n" +
"\tuser_name\x18\x01 \x01(\tR\buserName\x12#\n" +
"\rstandard_used\x18\x02 \x01(\bR\fstandardUsed\x12\x1b\n" +
"\tyaml_used\x18\x03 \x01(\bR\byamlUsed\x12&\n" +
"\x0fmode_when_saved\x18\x04 \x01(\tR\rmodeWhenSaved\x12A\n" +
"\x1dfields_with_conversion_errors\x18\x05 \x03(\tR\x1afieldsWithConversionErrors\">\n" +
"\x1fUICreateNewRoleCancelClickEvent\x12\x1b\n" +
"\tuser_name\x18\x01 \x01(\tR\buserName\"I\n" +
"*UICreateNewRoleViewDocumentationClickEvent\x12\x1b\n" +
+64 -1
View File
@@ -1379,6 +1379,37 @@ export interface UICreateNewRoleSaveClickEvent {
* @generated from protobuf field: string user_name = 1;
*/
userName: string;
/**
* StandardUsed indicates if the user interacted with the standard editor
* tab.
*
* @generated from protobuf field: bool standard_used = 2;
*/
standardUsed: boolean;
/**
* YamlUsed indicates if the user interacted with the YAML editor tab.
*
* @generated from protobuf field: bool yaml_used = 3;
*/
yamlUsed: boolean;
/**
* ModeWhenSaved indicates which editor tab was active when the Save button
* was clicked ("standard" or "yaml"). Note that it's inherently different
* from what `StandardUsed` or `YamlUsed` describe; the user can interact
* with one kind of editor, then verify the results in another, and
* ultimately click Save on any of them.
*
* @generated from protobuf field: string mode_when_saved = 4;
*/
modeWhenSaved: string;
/**
* A list of field paths that prevented the standard editor from being
* operational, if any. Looking at these may provide insight into which
* missing features should be implemented first.
*
* @generated from protobuf field: repeated string fields_with_conversion_errors = 5;
*/
fieldsWithConversionErrors: string[];
}
/**
* UICreateNewRoleCancelClickEvent is an event that can be triggered during custom role creation
@@ -7316,12 +7347,20 @@ export const UICreateNewRoleClickEvent = new UICreateNewRoleClickEvent$Type();
class UICreateNewRoleSaveClickEvent$Type extends MessageType<UICreateNewRoleSaveClickEvent> {
constructor() {
super("prehog.v1alpha.UICreateNewRoleSaveClickEvent", [
{ no: 1, name: "user_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
{ no: 1, name: "user_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 2, name: "standard_used", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
{ no: 3, name: "yaml_used", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
{ no: 4, name: "mode_when_saved", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 5, name: "fields_with_conversion_errors", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }
]);
}
create(value?: PartialMessage<UICreateNewRoleSaveClickEvent>): UICreateNewRoleSaveClickEvent {
const message = globalThis.Object.create((this.messagePrototype!));
message.userName = "";
message.standardUsed = false;
message.yamlUsed = false;
message.modeWhenSaved = "";
message.fieldsWithConversionErrors = [];
if (value !== undefined)
reflectionMergePartial<UICreateNewRoleSaveClickEvent>(this, message, value);
return message;
@@ -7334,6 +7373,18 @@ class UICreateNewRoleSaveClickEvent$Type extends MessageType<UICreateNewRoleSave
case /* string user_name */ 1:
message.userName = reader.string();
break;
case /* bool standard_used */ 2:
message.standardUsed = reader.bool();
break;
case /* bool yaml_used */ 3:
message.yamlUsed = reader.bool();
break;
case /* string mode_when_saved */ 4:
message.modeWhenSaved = reader.string();
break;
case /* repeated string fields_with_conversion_errors */ 5:
message.fieldsWithConversionErrors.push(reader.string());
break;
default:
let u = options.readUnknownField;
if (u === "throw")
@@ -7349,6 +7400,18 @@ class UICreateNewRoleSaveClickEvent$Type extends MessageType<UICreateNewRoleSave
/* string user_name = 1; */
if (message.userName !== "")
writer.tag(1, WireType.LengthDelimited).string(message.userName);
/* bool standard_used = 2; */
if (message.standardUsed !== false)
writer.tag(2, WireType.Varint).bool(message.standardUsed);
/* bool yaml_used = 3; */
if (message.yamlUsed !== false)
writer.tag(3, WireType.Varint).bool(message.yamlUsed);
/* string mode_when_saved = 4; */
if (message.modeWhenSaved !== "")
writer.tag(4, WireType.LengthDelimited).string(message.modeWhenSaved);
/* repeated string fields_with_conversion_errors = 5; */
for (let i = 0; i < message.fieldsWithConversionErrors.length; i++)
writer.tag(5, WireType.LengthDelimited).string(message.fieldsWithConversionErrors[i]);
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
+10 -2
View File
@@ -504,7 +504,11 @@ func (u *UICreateNewRoleSaveClickEvent) Anonymize(a utils.Anonymizer) prehogv1a.
return prehogv1a.SubmitEventRequest{
Event: &prehogv1a.SubmitEventRequest_UiCreateNewRoleSaveClick{
UiCreateNewRoleSaveClick: &prehogv1a.UICreateNewRoleSaveClickEvent{
UserName: a.AnonymizeString(u.UserName),
UserName: a.AnonymizeString(u.UserName),
StandardUsed: u.StandardUsed,
YamlUsed: u.YamlUsed,
ModeWhenSaved: u.ModeWhenSaved,
FieldsWithConversionErrors: u.FieldsWithConversionErrors,
},
},
}
@@ -1426,7 +1430,11 @@ func ConvertUsageEvent(event *usageeventsv1.UsageEventOneOf, userMD UserMetadata
}, nil
case *usageeventsv1.UsageEventOneOf_UiCreateNewRoleSaveClick:
return &UICreateNewRoleSaveClickEvent{
UserName: userMD.Username,
UserName: userMD.Username,
StandardUsed: e.UiCreateNewRoleSaveClick.StandardUsed,
YamlUsed: e.UiCreateNewRoleSaveClick.YamlUsed,
ModeWhenSaved: e.UiCreateNewRoleSaveClick.ModeWhenSaved,
FieldsWithConversionErrors: e.UiCreateNewRoleSaveClick.FieldsWithConversionErrors,
}, nil
case *usageeventsv1.UsageEventOneOf_UiCreateNewRoleCancelClick:
return &UICreateNewRoleCancelClickEvent{
+15 -1
View File
@@ -354,8 +354,22 @@ func ConvertUserEventRequestToUsageEvent(req CreateUserEventRequest) (*usageeven
nil
case createNewRoleSaveClickEvent:
roleEvent := struct {
StandardUsed bool `json:"standardUsed"`
YAMLUsed bool `json:"yamlUsed"`
ModeWhenSaved string `json:"modeWhenSaved"`
FieldsWithConversionErrors []string `json:"fieldsWithConversionErrors"`
}{}
if err := json.Unmarshal([]byte(*req.EventData), &roleEvent); err != nil {
return nil, trace.BadParameter("eventData is invalid: %v", err)
}
return &usageeventsv1.UsageEventOneOf{Event: &usageeventsv1.UsageEventOneOf_UiCreateNewRoleSaveClick{
UiCreateNewRoleSaveClick: &usageeventsv1.UICreateNewRoleSaveClickEvent{},
UiCreateNewRoleSaveClick: &usageeventsv1.UICreateNewRoleSaveClickEvent{
StandardUsed: roleEvent.StandardUsed,
YamlUsed: roleEvent.YAMLUsed,
ModeWhenSaved: roleEvent.ModeWhenSaved,
FieldsWithConversionErrors: roleEvent.FieldsWithConversionErrors,
},
}},
nil
+15
View File
@@ -801,6 +801,21 @@ message UICreateNewRoleClickEvent {
message UICreateNewRoleSaveClickEvent {
//anonymized
string user_name = 1;
// StandardUsed indicates if the user interacted with the standard editor
// tab.
bool standard_used = 2;
// YamlUsed indicates if the user interacted with the YAML editor tab.
bool yaml_used = 3;
// ModeWhenSaved indicates which editor tab was active when the Save button
// was clicked ("standard" or "yaml"). Note that it's inherently different
// from what `StandardUsed` or `YamlUsed` describe; the user can interact
// with one kind of editor, then verify the results in another, and
// ultimately click Save on any of them.
string mode_when_saved = 4;
// A list of field paths that prevented the standard editor from being
// operational, if any. Looking at these may provide insight into which
// missing features should be implemented first.
repeated string fields_with_conversion_errors = 5;
}
// UICreateNewRoleCancelClickEvent is an event that can be triggered during custom role creation
@@ -29,7 +29,12 @@ import ResourceService, {
RoleWithYaml,
} from 'teleport/services/resources';
import { storageService } from 'teleport/services/storageService';
import { CaptureEvent, userEventService } from 'teleport/services/userEvent';
import {
CaptureEvent,
CreateNewRoleSaveClickEventData,
RoleEditorMode,
userEventService,
} from 'teleport/services/userEvent';
import { yamlService } from 'teleport/services/yaml';
import {
YamlStringifyRequest,
@@ -78,6 +83,9 @@ beforeEach(() => {
return toFauxYaml(withDefaults(req.resource));
});
jest.spyOn(userEventService, 'captureUserEvent').mockImplementation(() => {});
jest
.spyOn(userEventService, 'captureCreateNewRoleSaveClickEvent')
.mockImplementation(() => {});
jest
.spyOn(ResourceService.prototype, 'fetchRole')
.mockImplementation(async name => {
@@ -133,6 +141,7 @@ test('rendering and switching tabs for new role', async () => {
}, 10000);
test('rendering and switching tabs for a non-standard role', async () => {
const onSave = jest.fn();
const originalRole = withDefaults({
metadata: {
name: 'some-role',
@@ -142,7 +151,12 @@ test('rendering and switching tabs for a non-standard role', async () => {
deny: { node_labels: { foo: ['bar'] } },
},
});
render(<TestRoleEditor originalRole={newRoleWithYaml(originalRole)} />);
render(
<TestRoleEditor
originalRole={newRoleWithYaml(originalRole)}
onSave={onSave}
/>
);
expect(getYamlEditorTab()).toHaveAttribute('aria-selected', 'true');
expect(fromFauxYaml(await getTextEditorContents())).toEqual(originalRole);
expect(screen.getByRole('button', { name: 'Save Changes' })).toBeDisabled();
@@ -156,6 +170,22 @@ test('rendering and switching tabs for a non-standard role', async () => {
await user.click(getYamlEditorTab());
expect(fromFauxYaml(await getTextEditorContents())).toEqual(originalRole);
expect(screen.getByRole('button', { name: 'Save Changes' })).toBeDisabled();
await user.clear(await findTextEditor());
await user.type(await findTextEditor(), '{{"asdf":"qwer"}');
await user.click(screen.getByRole('button', { name: 'Save Changes' }));
expect(onSave).toHaveBeenCalledWith({
yaml: '{"asdf":"qwer"}',
});
expect(
userEventService.captureCreateNewRoleSaveClickEvent
).toHaveBeenCalledWith({
standardUsed: false,
yamlUsed: true,
modeWhenSaved: RoleEditorMode.Yaml,
fieldsWithConversionErrors: ['spec.deny.node_labels'],
} as CreateNewRoleSaveClickEventData);
});
it('calls onRoleUpdate on each modification in the standard editor', async () => {
@@ -355,9 +385,14 @@ test('saving a new role', async () => {
version: 'v8',
},
});
expect(userEventService.captureUserEvent).toHaveBeenCalledWith({
event: CaptureEvent.CreateNewRoleSaveClickEvent,
});
expect(
userEventService.captureCreateNewRoleSaveClickEvent
).toHaveBeenCalledWith({
standardUsed: true,
yamlUsed: false,
modeWhenSaved: RoleEditorMode.Standard,
fieldsWithConversionErrors: [],
} as CreateNewRoleSaveClickEventData);
});
describe('saving a new role after editing as YAML', () => {
@@ -373,9 +408,14 @@ describe('saving a new role after editing as YAML', () => {
expect(onSave).toHaveBeenCalledWith({
yaml: '{"foo":"bar"}',
});
expect(userEventService.captureUserEvent).toHaveBeenCalledWith({
event: CaptureEvent.CreateNewRoleSaveClickEvent,
});
expect(
userEventService.captureCreateNewRoleSaveClickEvent
).toHaveBeenCalledWith({
standardUsed: false,
yamlUsed: true,
modeWhenSaved: RoleEditorMode.Yaml,
fieldsWithConversionErrors: [],
} as CreateNewRoleSaveClickEventData);
});
test('with Policy enabled', async () => {
@@ -407,9 +447,14 @@ describe('saving a new role after editing as YAML', () => {
expect(onSave).toHaveBeenCalledWith({
yaml: '{"metadata":{"description":"foo"}}',
});
expect(userEventService.captureUserEvent).toHaveBeenCalledWith({
event: CaptureEvent.CreateNewRoleSaveClickEvent,
});
expect(
userEventService.captureCreateNewRoleSaveClickEvent
).toHaveBeenCalledWith({
standardUsed: false,
yamlUsed: true,
modeWhenSaved: RoleEditorMode.Yaml,
fieldsWithConversionErrors: [],
} as CreateNewRoleSaveClickEventData);
});
});
@@ -33,7 +33,11 @@ import { CatchError } from 'teleport/components/CatchError';
import cfg from 'teleport/config';
import { Role, RoleWithYaml } from 'teleport/services/resources';
import { storageService } from 'teleport/services/storageService';
import { CaptureEvent, userEventService } from 'teleport/services/userEvent';
import {
CaptureEvent,
RoleEditorMode,
userEventService,
} from 'teleport/services/userEvent';
import { yamlService } from 'teleport/services/yaml';
import { YamlSupportedResourceKind } from 'teleport/services/yaml/types';
@@ -107,6 +111,7 @@ export const RoleEditor = ({
const [yamlModel, setYamlModel] = useState<YamlEditorModel>({
content: originalRole?.yaml ?? '',
isDirty: !originalRole, // New role is dirty by default.
isTouched: false,
});
const isDirty = (): boolean => {
@@ -167,8 +172,14 @@ export const RoleEditor = ({
const [saveAttempt, handleSave] = useAsync(
async (r: Partial<RoleWithYaml>) => {
await onSave?.(r);
userEventService.captureUserEvent({
event: CaptureEvent.CreateNewRoleSaveClickEvent,
const fieldsWithConversionErrors = (
standardModel.roleModel?.conversionErrors ?? []
).flatMap(group => group.errors.map(err => err.path));
userEventService.captureCreateNewRoleSaveClickEvent({
modeWhenSaved: editorTabToMode[selectedEditorTab],
standardUsed: standardModel.isTouched,
yamlUsed: yamlModel.isTouched,
fieldsWithConversionErrors: fieldsWithConversionErrors,
});
}
);
@@ -191,10 +202,10 @@ export const RoleEditor = ({
yamlifyAttempt.status === 'processing' ||
saveAttempt.status === 'processing';
async function onTabChange(activeIndex: EditorTab, validator: Validator) {
async function onTabChange(newTab: EditorTab, validator: Validator) {
// The code below is not idempotent, so we need to protect ourselves from
// an accidental model replacement.
if (activeIndex === selectedEditorTab) return;
if (newTab === selectedEditorTab) return;
// Validate the model on tab switch, because the server-side yamlification
// requires model to be valid. However, if it's OK, we reset the validator.
@@ -209,7 +220,7 @@ export const RoleEditor = ({
}
validator.reset();
switch (activeIndex) {
switch (newTab) {
case EditorTab.Standard: {
if (!yamlModel.content) {
// nothing to parse.
@@ -236,14 +247,15 @@ export const RoleEditor = ({
setYamlModel({
content,
isDirty: originalRole?.yaml != content,
isTouched: false,
});
break;
}
default:
activeIndex satisfies never;
newTab satisfies never;
}
setSelectedEditorTab(activeIndex);
setSelectedEditorTab(newTab);
}
function confirmExit() {
@@ -359,6 +371,11 @@ export const RoleEditor = ({
);
};
const editorTabToMode: Record<EditorTab, RoleEditorMode> = {
[EditorTab.Standard]: RoleEditorMode.Standard,
[EditorTab.Yaml]: RoleEditorMode.Yaml,
};
const yamlModelToRole = ({ content }: YamlEditorModel) =>
yamlService.parse<Role>(YamlSupportedResourceKind.Role, {
yaml: content,
@@ -62,7 +62,7 @@ export const AdminRules = memo(function AdminRules({
dispatch,
}: SectionPropsWithDispatch<RuleModel[], AdminRuleValidationResult[]>) {
function addRule() {
dispatch({ type: 'add-access-rule' });
dispatch({ type: ActionType.AddAdminRule });
}
return (
<Flex flexDirection="column" gap={3}>
@@ -71,6 +71,12 @@ export type StandardEditorModel = {
* Will be true if fields have been modified from the original.
*/
isDirty: boolean;
/**
* Indicates if the user interacted with the editor. It's different from
* {@link StandardEditorModel.isDirty} by not taking into consideration if
* anything changed from the original.
*/
isTouched: boolean;
/**
* Result of validating {@link StandardEditorModel.roleModel}. Can be
* undefined if there was an unhandled error when converting an existing
@@ -67,6 +67,7 @@ const initializeState = (originalRole?: Role): StandardEditorModel => {
roleModel,
originalRole,
isDirty: !originalRole, // New role is dirty by default.
isTouched: false,
validationResult:
roleModel && validateRoleEditorModel(roleModel, undefined, undefined),
currentTab: StandardEditorTab.Overview,
@@ -161,7 +162,7 @@ type RemoveResourceAccessAction = {
type: ActionType.RemoveResourceAccess;
payload: { kind: ResourceAccessKind };
};
type AddAdminRuleAction = { type: 'add-access-rule'; payload?: never };
type AddAdminRuleAction = { type: ActionType.AddAdminRule; payload?: never };
type SetAdminRuleResourcesAction = {
type: ActionType.SetAdminRuleResources;
payload: { id: string; resources: readonly ResourceKindOption[] };
@@ -207,11 +208,13 @@ const reduce = (
case ActionType.SetModel:
state.roleModel = payload;
state.isTouched = false;
break;
case ActionType.ResetToStandard:
state.roleModel.conversionErrors = [];
state.roleModel.requiresReset = false;
state.isTouched = true;
break;
case ActionType.SetMetadata:
@@ -220,6 +223,7 @@ const reduce = (
state.roleModel.resources,
payload.version.value
);
state.isTouched = true;
break;
case ActionType.SetRoleNameCollision:
@@ -228,28 +232,33 @@ const reduce = (
case ActionType.SetOptions:
state.roleModel.options = payload;
state.isTouched = true;
break;
case ActionType.AddResourceAccess:
state.roleModel.resources.push(
newResourceAccess(payload.kind, state.roleModel.metadata.version.value)
);
state.isTouched = true;
break;
case ActionType.SetResourceAccess:
state.roleModel.resources = state.roleModel.resources.map(r =>
r.kind === payload.kind ? payload : r
);
state.isTouched = true;
break;
case ActionType.RemoveResourceAccess:
state.roleModel.resources = state.roleModel.resources.filter(
r => r.kind !== payload.kind
);
state.isTouched = true;
break;
case 'add-access-rule':
case ActionType.AddAdminRule:
state.roleModel.rules.push(newRuleModel());
state.isTouched = true;
break;
case ActionType.SetAdminRuleResources: {
@@ -271,6 +280,7 @@ const reduce = (
}
}
rule.verbs = newVerbs;
state.isTouched = true;
break;
}
@@ -280,6 +290,7 @@ const reduce = (
if (!payload.checked) {
rule.allVerbs = false;
}
state.isTouched = true;
break;
}
@@ -292,18 +303,21 @@ const reduce = (
for (const v of rule.verbs) {
v.checked = payload.checked;
}
state.isTouched = true;
break;
}
case ActionType.SetAdminRuleWhere:
state.roleModel.rules.find(r => r.id === payload.id).where =
payload.where;
state.isTouched = true;
break;
case ActionType.RemoveAdminRule:
state.roleModel.rules = state.roleModel.rules.filter(
r => r.id !== payload.id
);
state.isTouched = true;
break;
case ActionType.EnableValidation:
@@ -61,6 +61,7 @@ export const YamlEditor = ({
}
onChange?.({
isDirty: originalRole?.yaml !== newContent,
isTouched: true,
content: newContent,
});
}
@@ -23,4 +23,10 @@ export type YamlEditorModel = {
* content were modified
*/
isDirty: boolean;
/**
* Indicates if the user interacted with the YAML editor. It's different from
* {@link YamlEditorModel.isDirty} by not taking into consideration if the
* content is different from the original.
*/
isTouched: boolean;
};
@@ -235,11 +235,15 @@ export enum DiscoverEventStatus {
Aborted = 'DISCOVER_STATUS_ABORTED', // user exits the wizard
}
export type UserEvent = {
event: CaptureEvent;
export type UserEvent<E = CaptureEvent> = {
event: E;
alert?: string;
};
type UserEventWithData<E, D> = UserEvent<E> & {
eventData: D;
};
export type EventMeta = {
username: string;
mfaType?: string;
@@ -248,10 +252,10 @@ export type EventMeta = {
export type PreUserEvent = UserEvent & EventMeta;
export type DiscoverEventRequest = Omit<UserEvent, 'event'> & {
event: DiscoverEvent;
eventData: DiscoverEventData;
};
export type DiscoverEventRequest = UserEventWithData<
DiscoverEvent,
DiscoverEventData
>;
export type DiscoverEventData = DiscoverEventStepStatus & {
id: string;
@@ -323,6 +327,11 @@ export enum CtaEvent {
CTA_OKTA_SCIM = 13,
}
export type CtaEventRequest = UserEventWithData<
CaptureEvent.UiCallToActionClickEvent,
CtaEvent
>;
export enum Feature {
FEATURES_UNSPECIFIED = 0,
FEATURES_TRUSTED_DEVICES = 1,
@@ -338,3 +347,25 @@ export type FeatureRecommendationEvent = {
Feature: Feature;
FeatureRecommendationStatus: FeatureRecommendationStatus;
};
export type FeatureRecommendationEventRequest = UserEventWithData<
CaptureEvent.FeatureRecommendationEvent,
FeatureRecommendationEvent
>;
export enum RoleEditorMode {
Standard = 'standard',
Yaml = 'yaml',
}
export type CreateNewRoleSaveClickEventData = {
standardUsed: boolean;
yamlUsed: boolean;
modeWhenSaved: RoleEditorMode;
fieldsWithConversionErrors: string[];
};
export type CreateNewRoleSaveClickEvent = UserEventWithData<
CaptureEvent.CreateNewRoleSaveClickEvent,
CreateNewRoleSaveClickEventData
>;
@@ -21,72 +21,83 @@ import api from 'teleport/services/api';
import {
CaptureEvent,
CreateNewRoleSaveClickEvent,
CreateNewRoleSaveClickEventData,
CtaEvent,
CtaEventRequest,
DiscoverEventRequest,
FeatureRecommendationEvent,
FeatureRecommendationEventRequest,
IntegrationEnrollEventRequest,
PreUserEvent,
UserEvent,
} from './types';
function captureEvent({
event,
path = cfg.api.captureUserEventPath,
}: {
event:
| UserEvent
| PreUserEvent
| DiscoverEventRequest
| IntegrationEnrollEventRequest
| CtaEventRequest
| FeatureRecommendationEventRequest
| CreateNewRoleSaveClickEvent;
path?: string;
}) {
// using api.fetch instead of api.fetchJSON
// because we are not expecting a JSON response
void api.fetch(path, {
method: 'POST',
body: JSON.stringify(event),
});
}
export const userEventService = {
captureUserEvent(userEvent: UserEvent) {
// using api.fetch instead of api.fetchJSON
// because we are not expecting a JSON response
void api.fetch(cfg.api.captureUserEventPath, {
method: 'POST',
body: JSON.stringify(userEvent),
});
captureUserEvent(event: UserEvent) {
captureEvent({ event });
},
capturePreUserEvent(preUserEvent: PreUserEvent) {
// using api.fetch instead of api.fetchJSON
// because we are not expecting a JSON response
void api.fetch(cfg.api.capturePreUserEventPath, {
method: 'POST',
body: JSON.stringify({ ...preUserEvent }),
});
capturePreUserEvent(event: PreUserEvent) {
captureEvent({ event, path: cfg.api.capturePreUserEventPath });
},
captureDiscoverEvent(event: DiscoverEventRequest) {
// using api.fetch instead of api.fetchJSON
// because we are not expecting a JSON response
void api.fetch(cfg.api.captureUserEventPath, {
method: 'POST',
body: JSON.stringify(event),
});
captureEvent({ event });
},
captureIntegrationEnrollEvent(event: IntegrationEnrollEventRequest) {
// using api.fetch instead of api.fetchJSON
// because we are not expecting a JSON response
void api.fetch(cfg.api.captureUserEventPath, {
method: 'POST',
body: JSON.stringify(event),
});
captureEvent({ event });
},
captureCtaEvent(event: CtaEvent) {
// using api.fetch instead of api.fetchJSON
// because we are not expecting a JSON response
void api.fetch(cfg.api.captureUserEventPath, {
method: 'POST',
body: JSON.stringify({
captureCtaEvent(eventData: CtaEvent) {
captureEvent({
event: {
event: CaptureEvent.UiCallToActionClickEvent,
eventData: event,
}),
eventData,
},
});
},
captureFeatureRecommendationEvent(event: FeatureRecommendationEvent) {
// using api.fetch instead of api.fetchJSON
// because we are not expecting a JSON response
void api.fetch(cfg.api.captureUserEventPath, {
method: 'POST',
body: JSON.stringify({
captureFeatureRecommendationEvent(eventData: FeatureRecommendationEvent) {
captureEvent({
event: {
event: CaptureEvent.FeatureRecommendationEvent,
eventData: event,
}),
eventData,
},
});
},
captureCreateNewRoleSaveClickEvent(
eventData: CreateNewRoleSaveClickEventData
) {
captureEvent({
event: {
event: CaptureEvent.CreateNewRoleSaveClickEvent,
eventData,
},
});
},
};