/
githubmirror
/
amphtml
Обзор
Документация
Войти
/
githubmirror
/
amphtml
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
validator/validator.pb.go
5 828 строк
253 KB
Viktor Szépe
Fix typos in validator/ (#39605)
09 ноя 2023, 12:01
Не верифицирован
09 ноя 2023, 12:01
798479b
Код
Авторство
О чём код?
// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 // protoc v3.16.0 // source: validator.proto // Package defines Validator protobuffers. This is a package comment required by // Golint for validator.pb.go, but Golint still fails with an error "Package // amp_validator (defined in [validator.pb.go]) should have a package comment". // This happens because protoc adds an extra line after the comment. Ignore the // error. package amp_validator import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // These two fields specify that values from one AttrSpec refer to values from // another AttrSpec elsewhere on the page; validator will verify the // references are not "dangling". These references may appear before or after // their referents. // // For example, in the "id" AttrSpec in the "template" TagSpec, we have: // add_value_to_set: TEMPLATE_IDS // and in any "template" AttrSpec, we have: // value_oneof_set: TEMPLATE_IDS // NEXT AVAILABLE TAG: 3 type AttrSpec_ValueSet int32 const ( AttrSpec_UNKNOWN_VALUESET AttrSpec_ValueSet = 0 // Never used AttrSpec_TEMPLATE_IDS AttrSpec_ValueSet = 1 // <template id> values AttrSpec_AMP_SCRIPT_IDS AttrSpec_ValueSet = 2 // <script id> values, referenced by <amp-script> ) // Enum value maps for AttrSpec_ValueSet. var ( AttrSpec_ValueSet_name = map[int32]string{ 0: "UNKNOWN_VALUESET", 1: "TEMPLATE_IDS", 2: "AMP_SCRIPT_IDS", } AttrSpec_ValueSet_value = map[string]int32{ "UNKNOWN_VALUESET": 0, "TEMPLATE_IDS": 1, "AMP_SCRIPT_IDS": 2, } ) func (x AttrSpec_ValueSet) Enum() *AttrSpec_ValueSet { p := new(AttrSpec_ValueSet) *p = x return p } func (x AttrSpec_ValueSet) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AttrSpec_ValueSet) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[0].Descriptor() } func (AttrSpec_ValueSet) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[0] } func (x AttrSpec_ValueSet) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *AttrSpec_ValueSet) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = AttrSpec_ValueSet(num) return nil } // Deprecated: Use AttrSpec_ValueSet.Descriptor instead. func (AttrSpec_ValueSet) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{5, 0} } type AttrSpec_DispatchKeyType int32 const ( // Indicates that the attribute does not form a dispatch key. AttrSpec_NONE_DISPATCH AttrSpec_DispatchKeyType = 0 // Indicates that the name of the attribute alone forms a dispatch key. AttrSpec_NAME_DISPATCH AttrSpec_DispatchKeyType = 1 // Indicates that the name + value of the attribute forms a dispatch key. AttrSpec_NAME_VALUE_DISPATCH AttrSpec_DispatchKeyType = 2 // Indicates that the name + value + mandatory parent forms a dispatch key. AttrSpec_NAME_VALUE_PARENT_DISPATCH AttrSpec_DispatchKeyType = 3 ) // Enum value maps for AttrSpec_DispatchKeyType. var ( AttrSpec_DispatchKeyType_name = map[int32]string{ 0: "NONE_DISPATCH", 1: "NAME_DISPATCH", 2: "NAME_VALUE_DISPATCH", 3: "NAME_VALUE_PARENT_DISPATCH", } AttrSpec_DispatchKeyType_value = map[string]int32{ "NONE_DISPATCH": 0, "NAME_DISPATCH": 1, "NAME_VALUE_DISPATCH": 2, "NAME_VALUE_PARENT_DISPATCH": 3, } ) func (x AttrSpec_DispatchKeyType) Enum() *AttrSpec_DispatchKeyType { p := new(AttrSpec_DispatchKeyType) *p = x return p } func (x AttrSpec_DispatchKeyType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AttrSpec_DispatchKeyType) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[1].Descriptor() } func (AttrSpec_DispatchKeyType) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[1] } func (x AttrSpec_DispatchKeyType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *AttrSpec_DispatchKeyType) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = AttrSpec_DispatchKeyType(num) return nil } // Deprecated: Use AttrSpec_DispatchKeyType.Descriptor instead. func (AttrSpec_DispatchKeyType) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{5, 1} } // NEXT AVAILABLE TAG: 10 type AmpLayout_Layout int32 const ( AmpLayout_CONTAINER AmpLayout_Layout = 5 AmpLayout_FILL AmpLayout_Layout = 6 AmpLayout_FIXED AmpLayout_Layout = 2 AmpLayout_FIXED_HEIGHT AmpLayout_Layout = 3 AmpLayout_FLEX_ITEM AmpLayout_Layout = 7 AmpLayout_FLUID AmpLayout_Layout = 8 AmpLayout_INTRINSIC AmpLayout_Layout = 9 AmpLayout_NODISPLAY AmpLayout_Layout = 1 AmpLayout_RESPONSIVE AmpLayout_Layout = 4 AmpLayout_UNKNOWN AmpLayout_Layout = 0 ) // Enum value maps for AmpLayout_Layout. var ( AmpLayout_Layout_name = map[int32]string{ 5: "CONTAINER", 6: "FILL", 2: "FIXED", 3: "FIXED_HEIGHT", 7: "FLEX_ITEM", 8: "FLUID", 9: "INTRINSIC", 1: "NODISPLAY", 4: "RESPONSIVE", 0: "UNKNOWN", } AmpLayout_Layout_value = map[string]int32{ "CONTAINER": 5, "FILL": 6, "FIXED": 2, "FIXED_HEIGHT": 3, "FLEX_ITEM": 7, "FLUID": 8, "INTRINSIC": 9, "NODISPLAY": 1, "RESPONSIVE": 4, "UNKNOWN": 0, } ) func (x AmpLayout_Layout) Enum() *AmpLayout_Layout { p := new(AmpLayout_Layout) *p = x return p } func (x AmpLayout_Layout) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AmpLayout_Layout) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[2].Descriptor() } func (AmpLayout_Layout) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[2] } func (x AmpLayout_Layout) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *AmpLayout_Layout) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = AmpLayout_Layout(num) return nil } // Deprecated: Use AmpLayout_Layout.Descriptor instead. func (AmpLayout_Layout) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{15, 0} } // NEXT AVAILABLE TAG: 2 type AncestorMarker_Marker int32 const ( AncestorMarker_UNKNOWN AncestorMarker_Marker = 0 // Set by <amp-sidebar> tags to allow autoscroll attributes on descendants. // See https://github.com/ampproject/amphtml/pull/20524 for more context. AncestorMarker_AUTOSCROLL AncestorMarker_Marker = 1 ) // Enum value maps for AncestorMarker_Marker. var ( AncestorMarker_Marker_name = map[int32]string{ 0: "UNKNOWN", 1: "AUTOSCROLL", } AncestorMarker_Marker_value = map[string]int32{ "UNKNOWN": 0, "AUTOSCROLL": 1, } ) func (x AncestorMarker_Marker) Enum() *AncestorMarker_Marker { p := new(AncestorMarker_Marker) *p = x return p } func (x AncestorMarker_Marker) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AncestorMarker_Marker) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[3].Descriptor() } func (AncestorMarker_Marker) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[3] } func (x AncestorMarker_Marker) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *AncestorMarker_Marker) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = AncestorMarker_Marker(num) return nil } // Deprecated: Use AncestorMarker_Marker.Descriptor instead. func (AncestorMarker_Marker) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{16, 0} } // Most extensions are custom-elements. For custom-template extensions, this // value needs to be set true. E.g: amp-mustache. // NEXT AVAILABLE TAG: 4 type ExtensionSpec_ExtensionType int32 const ( ExtensionSpec_UNKNOWN ExtensionSpec_ExtensionType = 0 ExtensionSpec_CUSTOM_ELEMENT ExtensionSpec_ExtensionType = 1 ExtensionSpec_CUSTOM_TEMPLATE ExtensionSpec_ExtensionType = 2 ExtensionSpec_HOST_SERVICE ExtensionSpec_ExtensionType = 3 ) // Enum value maps for ExtensionSpec_ExtensionType. var ( ExtensionSpec_ExtensionType_name = map[int32]string{ 0: "UNKNOWN", 1: "CUSTOM_ELEMENT", 2: "CUSTOM_TEMPLATE", 3: "HOST_SERVICE", } ExtensionSpec_ExtensionType_value = map[string]int32{ "UNKNOWN": 0, "CUSTOM_ELEMENT": 1, "CUSTOM_TEMPLATE": 2, "HOST_SERVICE": 3, } ) func (x ExtensionSpec_ExtensionType) Enum() *ExtensionSpec_ExtensionType { p := new(ExtensionSpec_ExtensionType) *p = x return p } func (x ExtensionSpec_ExtensionType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ExtensionSpec_ExtensionType) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[4].Descriptor() } func (ExtensionSpec_ExtensionType) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[4] } func (x ExtensionSpec_ExtensionType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *ExtensionSpec_ExtensionType) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = ExtensionSpec_ExtensionType(num) return nil } // Deprecated: Use ExtensionSpec_ExtensionType.Descriptor instead. func (ExtensionSpec_ExtensionType) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{19, 0} } // TagSpec.requires_extension will be set to the new extension's name on one // or more TagSpecs that require that extension. This typically creates 2 // validation requirements: // 1) If a tag is on the page whose TagSpec has the requires_extension // field set, but that extension is not present, this is an error. // (Usage requires extension). // 2) If an extension is on the page, but no tags indicating usage of that // extension via the required_extension field are on the page, this is an // error. (Extension requires usage). // // The second requirement (extension requires usage) has a few exceptions: // 1) For older extensions, implemented before these tagspec rules, we // do not want to introduce a breaking change, so we exempt these // extensions from the usage requirement. New extensions must use ERROR. // 2) Some extensions, such as `amp-dynamic-css-classes`, do not have any // associated tag in the document indicating usage. These extensions do // not trigger warnings or errors. // NEXT AVAILABLE TAG: 4 type ExtensionSpec_ExtensionUsageRequirement int32 const ( ExtensionSpec_ERROR ExtensionSpec_ExtensionUsageRequirement = 1 // Exception for exempted extensions. #1 above. ExtensionSpec_EXEMPTED ExtensionSpec_ExtensionUsageRequirement = 2 // Exception for extensions with no usage-indicating tag. #2 above. ExtensionSpec_NONE ExtensionSpec_ExtensionUsageRequirement = 3 ) // Enum value maps for ExtensionSpec_ExtensionUsageRequirement. var ( ExtensionSpec_ExtensionUsageRequirement_name = map[int32]string{ 1: "ERROR", 2: "EXEMPTED", 3: "NONE", } ExtensionSpec_ExtensionUsageRequirement_value = map[string]int32{ "ERROR": 1, "EXEMPTED": 2, "NONE": 3, } ) func (x ExtensionSpec_ExtensionUsageRequirement) Enum() *ExtensionSpec_ExtensionUsageRequirement { p := new(ExtensionSpec_ExtensionUsageRequirement) *p = x return p } func (x ExtensionSpec_ExtensionUsageRequirement) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ExtensionSpec_ExtensionUsageRequirement) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[5].Descriptor() } func (ExtensionSpec_ExtensionUsageRequirement) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[5] } func (x ExtensionSpec_ExtensionUsageRequirement) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *ExtensionSpec_ExtensionUsageRequirement) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = ExtensionSpec_ExtensionUsageRequirement(num) return nil } // Deprecated: Use ExtensionSpec_ExtensionUsageRequirement.Descriptor instead. func (ExtensionSpec_ExtensionUsageRequirement) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{19, 1} } // NEXT AVAILABLE TAG: 6 type HtmlFormat_Code int32 const ( HtmlFormat_UNKNOWN_CODE HtmlFormat_Code = 0 // Never used HtmlFormat_AMP HtmlFormat_Code = 1 HtmlFormat_AMP4ADS HtmlFormat_Code = 2 HtmlFormat_AMP4EMAIL HtmlFormat_Code = 3 HtmlFormat_EXPERIMENTAL HtmlFormat_Code = 4 // Currently unused ) // Enum value maps for HtmlFormat_Code. var ( HtmlFormat_Code_name = map[int32]string{ 0: "UNKNOWN_CODE", 1: "AMP", 2: "AMP4ADS", 3: "AMP4EMAIL", 4: "EXPERIMENTAL", } HtmlFormat_Code_value = map[string]int32{ "UNKNOWN_CODE": 0, "AMP": 1, "AMP4ADS": 2, "AMP4EMAIL": 3, "EXPERIMENTAL": 4, } ) func (x HtmlFormat_Code) Enum() *HtmlFormat_Code { p := new(HtmlFormat_Code) *p = x return p } func (x HtmlFormat_Code) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (HtmlFormat_Code) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[6].Descriptor() } func (HtmlFormat_Code) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[6] } func (x HtmlFormat_Code) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *HtmlFormat_Code) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = HtmlFormat_Code(num) return nil } // Deprecated: Use HtmlFormat_Code.Descriptor instead. func (HtmlFormat_Code) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{20, 0} } // NamedId's are used to uniquely identify specific TagSpecs in the // validator rules in a stable manner. Most TagSpecs have no set NamedId. // If a TagSpec has a NamedId it must be unique. In other words, no two // TagSpec's may have the same NamedId except for the NOT_SET (0) value. // NEXT AVAILABLE TAG: 3 type TagSpec_NamedId int32 const ( TagSpec_NOT_SET TagSpec_NamedId = 0 // By convention, the first "word" in the Id should be the tag_name. TagSpec_LINK_FONT_STYLESHEET TagSpec_NamedId = 1 TagSpec_STYLE_AMP_CUSTOM TagSpec_NamedId = 2 ) // Enum value maps for TagSpec_NamedId. var ( TagSpec_NamedId_name = map[int32]string{ 0: "NOT_SET", 1: "LINK_FONT_STYLESHEET", 2: "STYLE_AMP_CUSTOM", } TagSpec_NamedId_value = map[string]int32{ "NOT_SET": 0, "LINK_FONT_STYLESHEET": 1, "STYLE_AMP_CUSTOM": 2, } ) func (x TagSpec_NamedId) Enum() *TagSpec_NamedId { p := new(TagSpec_NamedId) *p = x return p } func (x TagSpec_NamedId) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (TagSpec_NamedId) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[7].Descriptor() } func (TagSpec_NamedId) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[7] } func (x TagSpec_NamedId) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *TagSpec_NamedId) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = TagSpec_NamedId(num) return nil } // Deprecated: Use TagSpec_NamedId.Descriptor instead. func (TagSpec_NamedId) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{21, 0} } type ErrorCategory_Code int32 const ( ErrorCategory_UNKNOWN ErrorCategory_Code = 0 ) // Enum value maps for ErrorCategory_Code. var ( ErrorCategory_Code_name = map[int32]string{ 0: "UNKNOWN", } ErrorCategory_Code_value = map[string]int32{ "UNKNOWN": 0, } ) func (x ErrorCategory_Code) Enum() *ErrorCategory_Code { p := new(ErrorCategory_Code) *p = x return p } func (x ErrorCategory_Code) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ErrorCategory_Code) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[8].Descriptor() } func (ErrorCategory_Code) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[8] } func (x ErrorCategory_Code) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *ErrorCategory_Code) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = ErrorCategory_Code(num) return nil } // Deprecated: Use ErrorCategory_Code.Descriptor instead. func (ErrorCategory_Code) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{25, 0} } // NEXT AVAILABLE TAG: 5 type ValidationError_Severity int32 const ( ValidationError_UNKNOWN_SEVERITY ValidationError_Severity = 0 // A document with at least one error of this severity fails validation. ValidationError_ERROR ValidationError_Severity = 1 // A document may have warnings and still pass validation. ValidationError_WARNING ValidationError_Severity = 4 // DO NOT REASSIGN the previously used values 2, 3. ) // Enum value maps for ValidationError_Severity. var ( ValidationError_Severity_name = map[int32]string{ 0: "UNKNOWN_SEVERITY", 1: "ERROR", 4: "WARNING", } ValidationError_Severity_value = map[string]int32{ "UNKNOWN_SEVERITY": 0, "ERROR": 1, "WARNING": 4, } ) func (x ValidationError_Severity) Enum() *ValidationError_Severity { p := new(ValidationError_Severity) *p = x return p } func (x ValidationError_Severity) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ValidationError_Severity) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[9].Descriptor() } func (ValidationError_Severity) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[9] } func (x ValidationError_Severity) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *ValidationError_Severity) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = ValidationError_Severity(num) return nil } // Deprecated: Use ValidationError_Severity.Descriptor instead. func (ValidationError_Severity) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{26, 0} } // NEXT AVAILABLE TAG: 124 type ValidationError_Code int32 const ( ValidationError_UNKNOWN_CODE ValidationError_Code = 0 ValidationError_INVALID_DOCTYPE_HTML ValidationError_Code = 111 ValidationError_MANDATORY_TAG_MISSING ValidationError_Code = 1 ValidationError_TAG_REQUIRED_BY_MISSING ValidationError_Code = 24 ValidationError_WARNING_TAG_REQUIRED_BY_MISSING ValidationError_Code = 76 ValidationError_TAG_EXCLUDED_BY_TAG ValidationError_Code = 101 ValidationError_WARNING_EXTENSION_UNUSED ValidationError_Code = 79 ValidationError_EXTENSION_UNUSED ValidationError_Code = 84 ValidationError_WARNING_EXTENSION_DEPRECATED_VERSION ValidationError_Code = 80 ValidationError_INVALID_EXTENSION_VERSION ValidationError_Code = 122 ValidationError_INVALID_EXTENSION_PATH ValidationError_Code = 123 ValidationError_NON_LTS_SCRIPT_AFTER_LTS ValidationError_Code = 112 ValidationError_LTS_SCRIPT_AFTER_NON_LTS ValidationError_Code = 113 ValidationError_INCORRECT_SCRIPT_RELEASE_VERSION ValidationError_Code = 119 ValidationError_DISALLOWED_AMP_DOMAIN ValidationError_Code = 121 ValidationError_ATTR_REQUIRED_BUT_MISSING ValidationError_Code = 61 ValidationError_DISALLOWED_TAG ValidationError_Code = 2 ValidationError_GENERAL_DISALLOWED_TAG ValidationError_Code = 51 ValidationError_DISALLOWED_SCRIPT_TAG ValidationError_Code = 88 ValidationError_DISALLOWED_ATTR ValidationError_Code = 3 ValidationError_DISALLOWED_STYLE_ATTR ValidationError_Code = 81 ValidationError_INVALID_ATTR_VALUE ValidationError_Code = 4 ValidationError_DUPLICATE_ATTRIBUTE ValidationError_Code = 94 ValidationError_ATTR_VALUE_REQUIRED_BY_LAYOUT ValidationError_Code = 27 ValidationError_MISSING_LAYOUT_ATTRIBUTES ValidationError_Code = 105 ValidationError_IMPLIED_LAYOUT_INVALID ValidationError_Code = 22 ValidationError_SPECIFIED_LAYOUT_INVALID ValidationError_Code = 26 ValidationError_MANDATORY_ATTR_MISSING ValidationError_Code = 5 ValidationError_MANDATORY_ONEOF_ATTR_MISSING ValidationError_Code = 28 ValidationError_MANDATORY_ANYOF_ATTR_MISSING ValidationError_Code = 104 ValidationError_DUPLICATE_DIMENSION ValidationError_Code = 60 ValidationError_DUPLICATE_UNIQUE_TAG ValidationError_Code = 6 ValidationError_DUPLICATE_UNIQUE_TAG_WARNING ValidationError_Code = 77 ValidationError_WRONG_PARENT_TAG ValidationError_Code = 7 ValidationError_STYLESHEET_TOO_LONG ValidationError_Code = 50 ValidationError_STYLESHEET_AND_INLINE_STYLE_TOO_LONG ValidationError_Code = 102 ValidationError_INLINE_STYLE_TOO_LONG ValidationError_Code = 103 ValidationError_INLINE_SCRIPT_TOO_LONG ValidationError_Code = 118 ValidationError_MANDATORY_CDATA_MISSING_OR_INCORRECT ValidationError_Code = 9 ValidationError_CDATA_VIOLATES_DENYLIST ValidationError_Code = 30 ValidationError_NON_WHITESPACE_CDATA_ENCOUNTERED ValidationError_Code = 82 ValidationError_INVALID_JSON_CDATA ValidationError_Code = 106 ValidationError_DEPRECATED_ATTR ValidationError_Code = 11 ValidationError_DEPRECATED_TAG ValidationError_Code = 12 ValidationError_MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE ValidationError_Code = 14 ValidationError_INVALID_PROPERTY_VALUE_IN_ATTR_VALUE ValidationError_Code = 15 ValidationError_MISSING_URL ValidationError_Code = 35 ValidationError_INVALID_URL ValidationError_Code = 36 ValidationError_INVALID_URL_PROTOCOL ValidationError_Code = 37 ValidationError_DISALLOWED_DOMAIN ValidationError_Code = 62 ValidationError_DISALLOWED_RELATIVE_URL ValidationError_Code = 49 ValidationError_DISALLOWED_PROPERTY_IN_ATTR_VALUE ValidationError_Code = 16 ValidationError_MUTUALLY_EXCLUSIVE_ATTRS ValidationError_Code = 17 ValidationError_UNESCAPED_TEMPLATE_IN_ATTR_VALUE ValidationError_Code = 18 ValidationError_TEMPLATE_PARTIAL_IN_ATTR_VALUE ValidationError_Code = 19 ValidationError_TEMPLATE_IN_ATTR_NAME ValidationError_Code = 20 ValidationError_INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT ValidationError_Code = 21 ValidationError_DISALLOWED_TAG_ANCESTOR ValidationError_Code = 23 ValidationError_MANDATORY_LAST_CHILD_TAG ValidationError_Code = 89 ValidationError_MANDATORY_TAG_ANCESTOR ValidationError_Code = 31 ValidationError_MANDATORY_TAG_ANCESTOR_WITH_HINT ValidationError_Code = 32 ValidationError_ATTR_DISALLOWED_BY_IMPLIED_LAYOUT ValidationError_Code = 33 ValidationError_ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT ValidationError_Code = 34 ValidationError_INCORRECT_NUM_CHILD_TAGS ValidationError_Code = 56 ValidationError_INCORRECT_MIN_NUM_CHILD_TAGS ValidationError_Code = 85 ValidationError_DISALLOWED_CHILD_TAG_NAME ValidationError_Code = 57 ValidationError_DISALLOWED_FIRST_CHILD_TAG_NAME ValidationError_Code = 58 ValidationError_DISALLOWED_MANUFACTURED_BODY ValidationError_Code = 64 ValidationError_CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT ValidationError_Code = 66 ValidationError_MANDATORY_REFERENCE_POINT_MISSING ValidationError_Code = 67 ValidationError_DUPLICATE_REFERENCE_POINT ValidationError_Code = 68 ValidationError_TAG_NOT_ALLOWED_TO_HAVE_SIBLINGS ValidationError_Code = 87 ValidationError_TAG_REFERENCE_POINT_CONFLICT ValidationError_Code = 69 ValidationError_CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT_SINGULAR ValidationError_Code = 70 // TODO(gregable): Fix this spelling error: 'precede' ValidationError_BASE_TAG_MUST_PRECEED_ALL_URLS ValidationError_Code = 78 ValidationError_MISSING_REQUIRED_EXTENSION ValidationError_Code = 83 ValidationError_ATTR_MISSING_REQUIRED_EXTENSION ValidationError_Code = 97 ValidationError_DOCUMENT_TOO_COMPLEX ValidationError_Code = 86 ValidationError_INVALID_UTF8 ValidationError_Code = 96 ValidationError_DOCUMENT_SIZE_LIMIT_EXCEEDED ValidationError_Code = 108 ValidationError_DEV_MODE_ONLY ValidationError_Code = 109 ValidationError_AMP_EMAIL_MISSING_STRICT_CSS_ATTR ValidationError_Code = 120 ValidationError_VALUE_SET_MISMATCH ValidationError_Code = 110 ValidationError_CSS_SYNTAX_INVALID_AT_RULE ValidationError_Code = 29 ValidationError_CSS_SYNTAX_STRAY_TRAILING_BACKSLASH ValidationError_Code = 38 ValidationError_CSS_SYNTAX_UNTERMINATED_COMMENT ValidationError_Code = 39 ValidationError_CSS_SYNTAX_UNTERMINATED_STRING ValidationError_Code = 40 ValidationError_CSS_SYNTAX_BAD_URL ValidationError_Code = 41 ValidationError_CSS_SYNTAX_EOF_IN_PRELUDE_OF_QUALIFIED_RULE ValidationError_Code = 42 ValidationError_CSS_SYNTAX_INVALID_DECLARATION ValidationError_Code = 43 ValidationError_CSS_SYNTAX_INCOMPLETE_DECLARATION ValidationError_Code = 44 ValidationError_CSS_SYNTAX_ERROR_IN_PSEUDO_SELECTOR ValidationError_Code = 45 ValidationError_CSS_SYNTAX_MISSING_SELECTOR ValidationError_Code = 46 ValidationError_CSS_SYNTAX_NOT_A_SELECTOR_START ValidationError_Code = 47 ValidationError_CSS_SYNTAX_UNPARSED_INPUT_REMAINS_IN_SELECTOR ValidationError_Code = 48 ValidationError_CSS_SYNTAX_MISSING_URL ValidationError_Code = 52 ValidationError_CSS_SYNTAX_INVALID_URL ValidationError_Code = 53 ValidationError_CSS_SYNTAX_INVALID_URL_PROTOCOL ValidationError_Code = 54 ValidationError_CSS_SYNTAX_DISALLOWED_DOMAIN ValidationError_Code = 63 ValidationError_CSS_SYNTAX_DISALLOWED_RELATIVE_URL ValidationError_Code = 55 ValidationError_CSS_SYNTAX_INVALID_ATTR_SELECTOR ValidationError_Code = 59 ValidationError_CSS_SYNTAX_INVALID_PROPERTY ValidationError_Code = 90 ValidationError_CSS_SYNTAX_INVALID_PROPERTY_NOLIST ValidationError_Code = 95 ValidationError_CSS_SYNTAX_QUALIFIED_RULE_HAS_NO_DECLARATIONS ValidationError_Code = 91 ValidationError_CSS_SYNTAX_DISALLOWED_QUALIFIED_RULE_MUST_BE_INSIDE_KEYFRAME ValidationError_Code = 92 ValidationError_CSS_SYNTAX_DISALLOWED_KEYFRAME_INSIDE_KEYFRAME ValidationError_Code = 93 ValidationError_CSS_SYNTAX_MALFORMED_MEDIA_QUERY ValidationError_Code = 98 ValidationError_CSS_SYNTAX_DISALLOWED_MEDIA_TYPE ValidationError_Code = 99 ValidationError_CSS_SYNTAX_DISALLOWED_MEDIA_FEATURE ValidationError_Code = 100 ValidationError_CSS_SYNTAX_DISALLOWED_ATTR_SELECTOR ValidationError_Code = 114 ValidationError_CSS_SYNTAX_DISALLOWED_PSEUDO_CLASS ValidationError_Code = 115 ValidationError_CSS_SYNTAX_DISALLOWED_PSEUDO_ELEMENT ValidationError_Code = 116 ValidationError_CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE ValidationError_Code = 71 ValidationError_CSS_SYNTAX_DISALLOWED_IMPORTANT ValidationError_Code = 117 ValidationError_CSS_EXCESSIVELY_NESTED ValidationError_Code = 107 // The following codes are currently used only by A4A CSS validation. ValidationError_CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE_WITH_HINT ValidationError_Code = 72 ValidationError_CSS_SYNTAX_PROPERTY_DISALLOWED_WITHIN_AT_RULE ValidationError_Code = 73 ValidationError_CSS_SYNTAX_PROPERTY_DISALLOWED_TOGETHER_WITH ValidationError_Code = 74 ValidationError_CSS_SYNTAX_PROPERTY_REQUIRES_QUALIFICATION ValidationError_Code = 75 ) // Enum value maps for ValidationError_Code. var ( ValidationError_Code_name = map[int32]string{ 0: "UNKNOWN_CODE", 111: "INVALID_DOCTYPE_HTML", 1: "MANDATORY_TAG_MISSING", 24: "TAG_REQUIRED_BY_MISSING", 76: "WARNING_TAG_REQUIRED_BY_MISSING", 101: "TAG_EXCLUDED_BY_TAG", 79: "WARNING_EXTENSION_UNUSED", 84: "EXTENSION_UNUSED", 80: "WARNING_EXTENSION_DEPRECATED_VERSION", 122: "INVALID_EXTENSION_VERSION", 123: "INVALID_EXTENSION_PATH", 112: "NON_LTS_SCRIPT_AFTER_LTS", 113: "LTS_SCRIPT_AFTER_NON_LTS", 119: "INCORRECT_SCRIPT_RELEASE_VERSION", 121: "DISALLOWED_AMP_DOMAIN", 61: "ATTR_REQUIRED_BUT_MISSING", 2: "DISALLOWED_TAG", 51: "GENERAL_DISALLOWED_TAG", 88: "DISALLOWED_SCRIPT_TAG", 3: "DISALLOWED_ATTR", 81: "DISALLOWED_STYLE_ATTR", 4: "INVALID_ATTR_VALUE", 94: "DUPLICATE_ATTRIBUTE", 27: "ATTR_VALUE_REQUIRED_BY_LAYOUT", 105: "MISSING_LAYOUT_ATTRIBUTES", 22: "IMPLIED_LAYOUT_INVALID", 26: "SPECIFIED_LAYOUT_INVALID", 5: "MANDATORY_ATTR_MISSING", 28: "MANDATORY_ONEOF_ATTR_MISSING", 104: "MANDATORY_ANYOF_ATTR_MISSING", 60: "DUPLICATE_DIMENSION", 6: "DUPLICATE_UNIQUE_TAG", 77: "DUPLICATE_UNIQUE_TAG_WARNING", 7: "WRONG_PARENT_TAG", 50: "STYLESHEET_TOO_LONG", 102: "STYLESHEET_AND_INLINE_STYLE_TOO_LONG", 103: "INLINE_STYLE_TOO_LONG", 118: "INLINE_SCRIPT_TOO_LONG", 9: "MANDATORY_CDATA_MISSING_OR_INCORRECT", 30: "CDATA_VIOLATES_DENYLIST", 82: "NON_WHITESPACE_CDATA_ENCOUNTERED", 106: "INVALID_JSON_CDATA", 11: "DEPRECATED_ATTR", 12: "DEPRECATED_TAG", 14: "MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE", 15: "INVALID_PROPERTY_VALUE_IN_ATTR_VALUE", 35: "MISSING_URL", 36: "INVALID_URL", 37: "INVALID_URL_PROTOCOL", 62: "DISALLOWED_DOMAIN", 49: "DISALLOWED_RELATIVE_URL", 16: "DISALLOWED_PROPERTY_IN_ATTR_VALUE", 17: "MUTUALLY_EXCLUSIVE_ATTRS", 18: "UNESCAPED_TEMPLATE_IN_ATTR_VALUE", 19: "TEMPLATE_PARTIAL_IN_ATTR_VALUE", 20: "TEMPLATE_IN_ATTR_NAME", 21: "INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT", 23: "DISALLOWED_TAG_ANCESTOR", 89: "MANDATORY_LAST_CHILD_TAG", 31: "MANDATORY_TAG_ANCESTOR", 32: "MANDATORY_TAG_ANCESTOR_WITH_HINT", 33: "ATTR_DISALLOWED_BY_IMPLIED_LAYOUT", 34: "ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT", 56: "INCORRECT_NUM_CHILD_TAGS", 85: "INCORRECT_MIN_NUM_CHILD_TAGS", 57: "DISALLOWED_CHILD_TAG_NAME", 58: "DISALLOWED_FIRST_CHILD_TAG_NAME", 64: "DISALLOWED_MANUFACTURED_BODY", 66: "CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT", 67: "MANDATORY_REFERENCE_POINT_MISSING", 68: "DUPLICATE_REFERENCE_POINT", 87: "TAG_NOT_ALLOWED_TO_HAVE_SIBLINGS", 69: "TAG_REFERENCE_POINT_CONFLICT", 70: "CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT_SINGULAR", 78: "BASE_TAG_MUST_PRECEED_ALL_URLS", 83: "MISSING_REQUIRED_EXTENSION", 97: "ATTR_MISSING_REQUIRED_EXTENSION", 86: "DOCUMENT_TOO_COMPLEX", 96: "INVALID_UTF8", 108: "DOCUMENT_SIZE_LIMIT_EXCEEDED", 109: "DEV_MODE_ONLY", 120: "AMP_EMAIL_MISSING_STRICT_CSS_ATTR", 110: "VALUE_SET_MISMATCH", 29: "CSS_SYNTAX_INVALID_AT_RULE", 38: "CSS_SYNTAX_STRAY_TRAILING_BACKSLASH", 39: "CSS_SYNTAX_UNTERMINATED_COMMENT", 40: "CSS_SYNTAX_UNTERMINATED_STRING", 41: "CSS_SYNTAX_BAD_URL", 42: "CSS_SYNTAX_EOF_IN_PRELUDE_OF_QUALIFIED_RULE", 43: "CSS_SYNTAX_INVALID_DECLARATION", 44: "CSS_SYNTAX_INCOMPLETE_DECLARATION", 45: "CSS_SYNTAX_ERROR_IN_PSEUDO_SELECTOR", 46: "CSS_SYNTAX_MISSING_SELECTOR", 47: "CSS_SYNTAX_NOT_A_SELECTOR_START", 48: "CSS_SYNTAX_UNPARSED_INPUT_REMAINS_IN_SELECTOR", 52: "CSS_SYNTAX_MISSING_URL", 53: "CSS_SYNTAX_INVALID_URL", 54: "CSS_SYNTAX_INVALID_URL_PROTOCOL", 63: "CSS_SYNTAX_DISALLOWED_DOMAIN", 55: "CSS_SYNTAX_DISALLOWED_RELATIVE_URL", 59: "CSS_SYNTAX_INVALID_ATTR_SELECTOR", 90: "CSS_SYNTAX_INVALID_PROPERTY", 95: "CSS_SYNTAX_INVALID_PROPERTY_NOLIST", 91: "CSS_SYNTAX_QUALIFIED_RULE_HAS_NO_DECLARATIONS", 92: "CSS_SYNTAX_DISALLOWED_QUALIFIED_RULE_MUST_BE_INSIDE_KEYFRAME", 93: "CSS_SYNTAX_DISALLOWED_KEYFRAME_INSIDE_KEYFRAME", 98: "CSS_SYNTAX_MALFORMED_MEDIA_QUERY", 99: "CSS_SYNTAX_DISALLOWED_MEDIA_TYPE", 100: "CSS_SYNTAX_DISALLOWED_MEDIA_FEATURE", 114: "CSS_SYNTAX_DISALLOWED_ATTR_SELECTOR", 115: "CSS_SYNTAX_DISALLOWED_PSEUDO_CLASS", 116: "CSS_SYNTAX_DISALLOWED_PSEUDO_ELEMENT", 71: "CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE", 117: "CSS_SYNTAX_DISALLOWED_IMPORTANT", 107: "CSS_EXCESSIVELY_NESTED", 72: "CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE_WITH_HINT", 73: "CSS_SYNTAX_PROPERTY_DISALLOWED_WITHIN_AT_RULE", 74: "CSS_SYNTAX_PROPERTY_DISALLOWED_TOGETHER_WITH", 75: "CSS_SYNTAX_PROPERTY_REQUIRES_QUALIFICATION", } ValidationError_Code_value = map[string]int32{ "UNKNOWN_CODE": 0, "INVALID_DOCTYPE_HTML": 111, "MANDATORY_TAG_MISSING": 1, "TAG_REQUIRED_BY_MISSING": 24, "WARNING_TAG_REQUIRED_BY_MISSING": 76, "TAG_EXCLUDED_BY_TAG": 101, "WARNING_EXTENSION_UNUSED": 79, "EXTENSION_UNUSED": 84, "WARNING_EXTENSION_DEPRECATED_VERSION": 80, "INVALID_EXTENSION_VERSION": 122, "INVALID_EXTENSION_PATH": 123, "NON_LTS_SCRIPT_AFTER_LTS": 112, "LTS_SCRIPT_AFTER_NON_LTS": 113, "INCORRECT_SCRIPT_RELEASE_VERSION": 119, "DISALLOWED_AMP_DOMAIN": 121, "ATTR_REQUIRED_BUT_MISSING": 61, "DISALLOWED_TAG": 2, "GENERAL_DISALLOWED_TAG": 51, "DISALLOWED_SCRIPT_TAG": 88, "DISALLOWED_ATTR": 3, "DISALLOWED_STYLE_ATTR": 81, "INVALID_ATTR_VALUE": 4, "DUPLICATE_ATTRIBUTE": 94, "ATTR_VALUE_REQUIRED_BY_LAYOUT": 27, "MISSING_LAYOUT_ATTRIBUTES": 105, "IMPLIED_LAYOUT_INVALID": 22, "SPECIFIED_LAYOUT_INVALID": 26, "MANDATORY_ATTR_MISSING": 5, "MANDATORY_ONEOF_ATTR_MISSING": 28, "MANDATORY_ANYOF_ATTR_MISSING": 104, "DUPLICATE_DIMENSION": 60, "DUPLICATE_UNIQUE_TAG": 6, "DUPLICATE_UNIQUE_TAG_WARNING": 77, "WRONG_PARENT_TAG": 7, "STYLESHEET_TOO_LONG": 50, "STYLESHEET_AND_INLINE_STYLE_TOO_LONG": 102, "INLINE_STYLE_TOO_LONG": 103, "INLINE_SCRIPT_TOO_LONG": 118, "MANDATORY_CDATA_MISSING_OR_INCORRECT": 9, "CDATA_VIOLATES_DENYLIST": 30, "NON_WHITESPACE_CDATA_ENCOUNTERED": 82, "INVALID_JSON_CDATA": 106, "DEPRECATED_ATTR": 11, "DEPRECATED_TAG": 12, "MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE": 14, "INVALID_PROPERTY_VALUE_IN_ATTR_VALUE": 15, "MISSING_URL": 35, "INVALID_URL": 36, "INVALID_URL_PROTOCOL": 37, "DISALLOWED_DOMAIN": 62, "DISALLOWED_RELATIVE_URL": 49, "DISALLOWED_PROPERTY_IN_ATTR_VALUE": 16, "MUTUALLY_EXCLUSIVE_ATTRS": 17, "UNESCAPED_TEMPLATE_IN_ATTR_VALUE": 18, "TEMPLATE_PARTIAL_IN_ATTR_VALUE": 19, "TEMPLATE_IN_ATTR_NAME": 20, "INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT": 21, "DISALLOWED_TAG_ANCESTOR": 23, "MANDATORY_LAST_CHILD_TAG": 89, "MANDATORY_TAG_ANCESTOR": 31, "MANDATORY_TAG_ANCESTOR_WITH_HINT": 32, "ATTR_DISALLOWED_BY_IMPLIED_LAYOUT": 33, "ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT": 34, "INCORRECT_NUM_CHILD_TAGS": 56, "INCORRECT_MIN_NUM_CHILD_TAGS": 85, "DISALLOWED_CHILD_TAG_NAME": 57, "DISALLOWED_FIRST_CHILD_TAG_NAME": 58, "DISALLOWED_MANUFACTURED_BODY": 64, "CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT": 66, "MANDATORY_REFERENCE_POINT_MISSING": 67, "DUPLICATE_REFERENCE_POINT": 68, "TAG_NOT_ALLOWED_TO_HAVE_SIBLINGS": 87, "TAG_REFERENCE_POINT_CONFLICT": 69, "CHILD_TAG_DOES_NOT_SATISFY_REFERENCE_POINT_SINGULAR": 70, "BASE_TAG_MUST_PRECEED_ALL_URLS": 78, "MISSING_REQUIRED_EXTENSION": 83, "ATTR_MISSING_REQUIRED_EXTENSION": 97, "DOCUMENT_TOO_COMPLEX": 86, "INVALID_UTF8": 96, "DOCUMENT_SIZE_LIMIT_EXCEEDED": 108, "DEV_MODE_ONLY": 109, "AMP_EMAIL_MISSING_STRICT_CSS_ATTR": 120, "VALUE_SET_MISMATCH": 110, "CSS_SYNTAX_INVALID_AT_RULE": 29, "CSS_SYNTAX_STRAY_TRAILING_BACKSLASH": 38, "CSS_SYNTAX_UNTERMINATED_COMMENT": 39, "CSS_SYNTAX_UNTERMINATED_STRING": 40, "CSS_SYNTAX_BAD_URL": 41, "CSS_SYNTAX_EOF_IN_PRELUDE_OF_QUALIFIED_RULE": 42, "CSS_SYNTAX_INVALID_DECLARATION": 43, "CSS_SYNTAX_INCOMPLETE_DECLARATION": 44, "CSS_SYNTAX_ERROR_IN_PSEUDO_SELECTOR": 45, "CSS_SYNTAX_MISSING_SELECTOR": 46, "CSS_SYNTAX_NOT_A_SELECTOR_START": 47, "CSS_SYNTAX_UNPARSED_INPUT_REMAINS_IN_SELECTOR": 48, "CSS_SYNTAX_MISSING_URL": 52, "CSS_SYNTAX_INVALID_URL": 53, "CSS_SYNTAX_INVALID_URL_PROTOCOL": 54, "CSS_SYNTAX_DISALLOWED_DOMAIN": 63, "CSS_SYNTAX_DISALLOWED_RELATIVE_URL": 55, "CSS_SYNTAX_INVALID_ATTR_SELECTOR": 59, "CSS_SYNTAX_INVALID_PROPERTY": 90, "CSS_SYNTAX_INVALID_PROPERTY_NOLIST": 95, "CSS_SYNTAX_QUALIFIED_RULE_HAS_NO_DECLARATIONS": 91, "CSS_SYNTAX_DISALLOWED_QUALIFIED_RULE_MUST_BE_INSIDE_KEYFRAME": 92, "CSS_SYNTAX_DISALLOWED_KEYFRAME_INSIDE_KEYFRAME": 93, "CSS_SYNTAX_MALFORMED_MEDIA_QUERY": 98, "CSS_SYNTAX_DISALLOWED_MEDIA_TYPE": 99, "CSS_SYNTAX_DISALLOWED_MEDIA_FEATURE": 100, "CSS_SYNTAX_DISALLOWED_ATTR_SELECTOR": 114, "CSS_SYNTAX_DISALLOWED_PSEUDO_CLASS": 115, "CSS_SYNTAX_DISALLOWED_PSEUDO_ELEMENT": 116, "CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE": 71, "CSS_SYNTAX_DISALLOWED_IMPORTANT": 117, "CSS_EXCESSIVELY_NESTED": 107, "CSS_SYNTAX_DISALLOWED_PROPERTY_VALUE_WITH_HINT": 72, "CSS_SYNTAX_PROPERTY_DISALLOWED_WITHIN_AT_RULE": 73, "CSS_SYNTAX_PROPERTY_DISALLOWED_TOGETHER_WITH": 74, "CSS_SYNTAX_PROPERTY_REQUIRES_QUALIFICATION": 75, } ) func (x ValidationError_Code) Enum() *ValidationError_Code { p := new(ValidationError_Code) *p = x return p } func (x ValidationError_Code) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ValidationError_Code) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[10].Descriptor() } func (ValidationError_Code) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[10] } func (x ValidationError_Code) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *ValidationError_Code) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = ValidationError_Code(num) return nil } // Deprecated: Use ValidationError_Code.Descriptor instead. func (ValidationError_Code) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{26, 1} } // NEXT AVAILABLE TAG: 3 type ValidationResult_Status int32 const ( ValidationResult_UNKNOWN ValidationResult_Status = 0 ValidationResult_PASS ValidationResult_Status = 1 ValidationResult_FAIL ValidationResult_Status = 2 ) // Enum value maps for ValidationResult_Status. var ( ValidationResult_Status_name = map[int32]string{ 0: "UNKNOWN", 1: "PASS", 2: "FAIL", } ValidationResult_Status_value = map[string]int32{ "UNKNOWN": 0, "PASS": 1, "FAIL": 2, } ) func (x ValidationResult_Status) Enum() *ValidationResult_Status { p := new(ValidationResult_Status) *p = x return p } func (x ValidationResult_Status) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (ValidationResult_Status) Descriptor() protoreflect.EnumDescriptor { return file_validator_proto_enumTypes[11].Descriptor() } func (ValidationResult_Status) Type() protoreflect.EnumType { return &file_validator_proto_enumTypes[11] } func (x ValidationResult_Status) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Do not use. func (x *ValidationResult_Status) UnmarshalJSON(b []byte) error { num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } *x = ValidationResult_Status(num) return nil } // Deprecated: Use ValidationResult_Status.Descriptor instead. func (ValidationResult_Status) EnumDescriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{31, 0} } // Used for validating attributes that require another attribute for some // given set of conditions. // E.g. attr name: "on" if_value_regex: "tap:.*" also_require_attr: "role" // NEXT AVAILABLE TAG: 3 type AttrTriggerSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // If set, attribute's value must match to also require attribute(s). // If not set, attribute automatically also require attribute(s). IfValueRegex *string `protobuf:"bytes,1,opt,name=if_value_regex,json=ifValueRegex" json:"if_value_regex,omitempty"` // case sensitive // If set, other attributes - identified by their name string - must // be present as well. AlsoRequiresAttr []string `protobuf:"bytes,2,rep,name=also_requires_attr,json=alsoRequiresAttr" json:"also_requires_attr,omitempty"` } func (x *AttrTriggerSpec) Reset() { *x = AttrTriggerSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AttrTriggerSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*AttrTriggerSpec) ProtoMessage() {} func (x *AttrTriggerSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AttrTriggerSpec.ProtoReflect.Descriptor instead. func (*AttrTriggerSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{0} } func (x *AttrTriggerSpec) GetIfValueRegex() string { if x != nil && x.IfValueRegex != nil { return *x.IfValueRegex } return "" } func (x *AttrTriggerSpec) GetAlsoRequiresAttr() []string { if x != nil { return x.AlsoRequiresAttr } return nil } // Used for validating properties in attribute values. Our validator // (via parse-viewport.h) implements the parsing algorithm as described here: // https://drafts.csswg.org/css-device-adapt/#parsing-algorithm // NEXT AVAILABLE TAG: 5 type PropertySpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Must be lowercase, and will be matched case-insensitively. Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Mandatory *bool `protobuf:"varint,2,opt,name=mandatory" json:"mandatory,omitempty"` // Must be lowercase, and will be matched case-insensitively. Value *string `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` ValueDouble *float64 `protobuf:"fixed64,4,opt,name=value_double,json=valueDouble" json:"value_double,omitempty"` // } end oneof } func (x *PropertySpec) Reset() { *x = PropertySpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *PropertySpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*PropertySpec) ProtoMessage() {} func (x *PropertySpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use PropertySpec.ProtoReflect.Descriptor instead. func (*PropertySpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{1} } func (x *PropertySpec) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *PropertySpec) GetMandatory() bool { if x != nil && x.Mandatory != nil { return *x.Mandatory } return false } func (x *PropertySpec) GetValue() string { if x != nil && x.Value != nil { return *x.Value } return "" } func (x *PropertySpec) GetValueDouble() float64 { if x != nil && x.ValueDouble != nil { return *x.ValueDouble } return 0 } // NEXT AVAILABLE TAG: 2 type PropertySpecList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Properties []*PropertySpec `protobuf:"bytes,1,rep,name=properties" json:"properties,omitempty"` } func (x *PropertySpecList) Reset() { *x = PropertySpecList{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *PropertySpecList) String() string { return protoimpl.X.MessageStringOf(x) } func (*PropertySpecList) ProtoMessage() {} func (x *PropertySpecList) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use PropertySpecList.ProtoReflect.Descriptor instead. func (*PropertySpecList) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{2} } func (x *PropertySpecList) GetProperties() []*PropertySpec { if x != nil { return x.Properties } return nil } // Used for validating urls in attribute values (such as href/src/srcset). // NEXT AVAILABLE TAG: 5 type UrlSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // protocol must be in lowercase (e.g. "javascript" not "JavaScript"). Protocol []string `protobuf:"bytes,1,rep,name=protocol" json:"protocol,omitempty"` AllowRelative *bool `protobuf:"varint,2,opt,name=allow_relative,json=allowRelative,def=1" json:"allow_relative,omitempty"` // Whether the empty string '' is allowed for this URL value. AllowEmpty *bool `protobuf:"varint,3,opt,name=allow_empty,json=allowEmpty,def=0" json:"allow_empty,omitempty"` } // Default values for UrlSpec fields. const ( Default_UrlSpec_AllowRelative = bool(true) Default_UrlSpec_AllowEmpty = bool(false) ) func (x *UrlSpec) Reset() { *x = UrlSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *UrlSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*UrlSpec) ProtoMessage() {} func (x *UrlSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UrlSpec.ProtoReflect.Descriptor instead. func (*UrlSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{3} } func (x *UrlSpec) GetProtocol() []string { if x != nil { return x.Protocol } return nil } func (x *UrlSpec) GetAllowRelative() bool { if x != nil && x.AllowRelative != nil { return *x.AllowRelative } return Default_UrlSpec_AllowRelative } func (x *UrlSpec) GetAllowEmpty() bool { if x != nil && x.AllowEmpty != nil { return *x.AllowEmpty } return Default_UrlSpec_AllowEmpty } // NEXT AVAILABLE TAG: 4 type CssDeclaration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The name of the declaration (e.g. display). Use lower-case attribute names // only. Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // This would be a oneof, but this file only uses features in protobuf 2.5.0. // begin oneof { // The valid values of the declaration (e.g. block). ValueCasei []string `protobuf:"bytes,2,rep,name=value_casei,json=valueCasei" json:"value_casei,omitempty"` ValueRegexCasei *string `protobuf:"bytes,3,opt,name=value_regex_casei,json=valueRegexCasei" json:"value_regex_casei,omitempty"` // } end oneof } func (x *CssDeclaration) Reset() { *x = CssDeclaration{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *CssDeclaration) String() string { return protoimpl.X.MessageStringOf(x) } func (*CssDeclaration) ProtoMessage() {} func (x *CssDeclaration) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CssDeclaration.ProtoReflect.Descriptor instead. func (*CssDeclaration) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{4} } func (x *CssDeclaration) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *CssDeclaration) GetValueCasei() []string { if x != nil { return x.ValueCasei } return nil } func (x *CssDeclaration) GetValueRegexCasei() string { if x != nil && x.ValueRegexCasei != nil { return *x.ValueRegexCasei } return "" } // Attributes that are not covered by at least one of these specs are // disallowed. Within a given context (e.g., for a given TagSpec), // names are unique. // NEXT AVAILABLE TAG: 29 type AttrSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // If provided, the Type Identifier(s) that either enable or disable // this AttrSpec. If a Type Identifier is in enabled_by then this // AttrSpec will be used in validating parsed documents with that Type // Identifier. If a Type Identifier is in disabled_by then this // AttrSpec will not be used in validating parsed documents with that // Type Identifier. An AttrSpec can not have both enabled_by and disabled_by // set. EnabledBy []string `protobuf:"bytes,23,rep,name=enabled_by,json=enabledBy" json:"enabled_by,omitempty"` DisabledBy []string `protobuf:"bytes,24,rep,name=disabled_by,json=disabledBy" json:"disabled_by,omitempty"` // Use lower-case attribute names only. Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` AlternativeNames []string `protobuf:"bytes,2,rep,name=alternative_names,json=alternativeNames" json:"alternative_names,omitempty"` Mandatory *bool `protobuf:"varint,3,opt,name=mandatory" json:"mandatory,omitempty"` // Within the context of the tag, *exactly one* of the attributes tagged // with this identifier must be present. Per convention, this identifier // should list the tags participating in the mandatory oneof: // e.g. mandatory_oneof: "['foo', 'bar']" MandatoryOneof *string `protobuf:"bytes,12,opt,name=mandatory_oneof,json=mandatoryOneof" json:"mandatory_oneof,omitempty"` // Within the context of the tag, *at least one* of the attributes tagged // with this identifier must be present. Per convention, this identifier // should list the tags participating in the mandatory oneof: // e.g. mandatory_oneof: "['foo', 'bar']" MandatoryAnyof *string `protobuf:"bytes,21,opt,name=mandatory_anyof,json=mandatoryAnyof" json:"mandatory_anyof,omitempty"` // The attribute value must be equal to the value in this field. Value []string `protobuf:"bytes,4,rep,name=value" json:"value,omitempty"` // case sensitive ValueCasei []string `protobuf:"bytes,18,rep,name=value_casei,json=valueCasei" json:"value_casei,omitempty"` // case insensitive ValueRegex *string `protobuf:"bytes,15,opt,name=value_regex,json=valueRegex" json:"value_regex,omitempty"` // case sensitive ValueRegexCasei *string `protobuf:"bytes,5,opt,name=value_regex_casei,json=valueRegexCasei" json:"value_regex_casei,omitempty"` // case insensitive ValueUrl *UrlSpec `protobuf:"bytes,14,opt,name=value_url,json=valueUrl" json:"value_url,omitempty"` // validates against a list of properties (see PropertySpec). ValueProperties *PropertySpecList `protobuf:"bytes,11,opt,name=value_properties,json=valueProperties" json:"value_properties,omitempty"` // If set, the attribute value will be evaluated using the matching document // level CSS rules. This flag is used for `style` attributes. If // `value_doc_css` is set, only non-SVG css is applied. If `value_doc_css_svg` // is set, SVG-specific CSS rules are also allowed for this attribute value. ValueDocCss *bool `protobuf:"varint,27,opt,name=value_doc_css,json=valueDocCss" json:"value_doc_css,omitempty"` ValueDocSvgCss *bool `protobuf:"varint,28,opt,name=value_doc_svg_css,json=valueDocSvgCss" json:"value_doc_svg_css,omitempty"` // } end oneof AddValueToSet *AttrSpec_ValueSet `protobuf:"varint,25,opt,name=add_value_to_set,json=addValueToSet,enum=amp.validator.AttrSpec_ValueSet" json:"add_value_to_set,omitempty"` ValueOneofSet *AttrSpec_ValueSet `protobuf:"varint,26,opt,name=value_oneof_set,json=valueOneofSet,enum=amp.validator.AttrSpec_ValueSet" json:"value_oneof_set,omitempty"` Trigger *AttrTriggerSpec `protobuf:"bytes,16,opt,name=trigger" json:"trigger,omitempty"` // If set, then the attribute value may not match this regex, which is // always applied case-insensitively and as a partial match. DisallowedValueRegex *string `protobuf:"bytes,6,opt,name=disallowed_value_regex,json=disallowedValueRegex" json:"disallowed_value_regex,omitempty"` // If set, generates a DEPRECATED_ATTR error with severity WARNING. // The value of the deprecation field indicates what to use instead, // e.g. the name of an attribute or tag. Deprecation *string `protobuf:"bytes,7,opt,name=deprecation" json:"deprecation,omitempty"` // If provided, a URL which links to the AMP HTML spec for this deprecation. DeprecationUrl *string `protobuf:"bytes,8,opt,name=deprecation_url,json=deprecationUrl" json:"deprecation_url,omitempty"` // Valid CSS declarations. CssDeclaration []*CssDeclaration `protobuf:"bytes,20,rep,name=css_declaration,json=cssDeclaration" json:"css_declaration,omitempty"` // If set true, the TagSpec containing this AttrSpec will be evaluated first // for any encountered tag which matches the tag name and this attribute spec. // May only be set for an AttrSpec where mandatory=true and type matches those // specified in the comments of DispatchKeyType above. DispatchKey *AttrSpec_DispatchKeyType `protobuf:"varint,13,opt,name=dispatch_key,json=dispatchKey,enum=amp.validator.AttrSpec_DispatchKeyType,def=0" json:"dispatch_key,omitempty"` // If set to true, the TagSpec containing this AttrSpec implicitly has this // attribute and the attribute is considered valid. Implicit *bool `protobuf:"varint,17,opt,name=implicit,def=0" json:"implicit,omitempty"` // If set, this attr is considered part of an amp extended component, and // requires that the named extended component script tag is present on the // page. RequiresExtension []string `protobuf:"bytes,19,rep,name=requires_extension,json=requiresExtension" json:"requires_extension,omitempty"` // If set, this attr is invalid unless the current tag has an ancestor // tag which set one or more of the required markers. RequiresAncestor *AncestorMarker `protobuf:"bytes,22,opt,name=requires_ancestor,json=requiresAncestor" json:"requires_ancestor,omitempty"` } // Default values for AttrSpec fields. const ( Default_AttrSpec_DispatchKey = AttrSpec_NONE_DISPATCH Default_AttrSpec_Implicit = bool(false) ) func (x *AttrSpec) Reset() { *x = AttrSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AttrSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*AttrSpec) ProtoMessage() {} func (x *AttrSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AttrSpec.ProtoReflect.Descriptor instead. func (*AttrSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{5} } func (x *AttrSpec) GetEnabledBy() []string { if x != nil { return x.EnabledBy } return nil } func (x *AttrSpec) GetDisabledBy() []string { if x != nil { return x.DisabledBy } return nil } func (x *AttrSpec) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *AttrSpec) GetAlternativeNames() []string { if x != nil { return x.AlternativeNames } return nil } func (x *AttrSpec) GetMandatory() bool { if x != nil && x.Mandatory != nil { return *x.Mandatory } return false } func (x *AttrSpec) GetMandatoryOneof() string { if x != nil && x.MandatoryOneof != nil { return *x.MandatoryOneof } return "" } func (x *AttrSpec) GetMandatoryAnyof() string { if x != nil && x.MandatoryAnyof != nil { return *x.MandatoryAnyof } return "" } func (x *AttrSpec) GetValue() []string { if x != nil { return x.Value } return nil } func (x *AttrSpec) GetValueCasei() []string { if x != nil { return x.ValueCasei } return nil } func (x *AttrSpec) GetValueRegex() string { if x != nil && x.ValueRegex != nil { return *x.ValueRegex } return "" } func (x *AttrSpec) GetValueRegexCasei() string { if x != nil && x.ValueRegexCasei != nil { return *x.ValueRegexCasei } return "" } func (x *AttrSpec) GetValueUrl() *UrlSpec { if x != nil { return x.ValueUrl } return nil } func (x *AttrSpec) GetValueProperties() *PropertySpecList { if x != nil { return x.ValueProperties } return nil } func (x *AttrSpec) GetValueDocCss() bool { if x != nil && x.ValueDocCss != nil { return *x.ValueDocCss } return false } func (x *AttrSpec) GetValueDocSvgCss() bool { if x != nil && x.ValueDocSvgCss != nil { return *x.ValueDocSvgCss } return false } func (x *AttrSpec) GetAddValueToSet() AttrSpec_ValueSet { if x != nil && x.AddValueToSet != nil { return *x.AddValueToSet } return AttrSpec_UNKNOWN_VALUESET } func (x *AttrSpec) GetValueOneofSet() AttrSpec_ValueSet { if x != nil && x.ValueOneofSet != nil { return *x.ValueOneofSet } return AttrSpec_UNKNOWN_VALUESET } func (x *AttrSpec) GetTrigger() *AttrTriggerSpec { if x != nil { return x.Trigger } return nil } func (x *AttrSpec) GetDisallowedValueRegex() string { if x != nil && x.DisallowedValueRegex != nil { return *x.DisallowedValueRegex } return "" } func (x *AttrSpec) GetDeprecation() string { if x != nil && x.Deprecation != nil { return *x.Deprecation } return "" } func (x *AttrSpec) GetDeprecationUrl() string { if x != nil && x.DeprecationUrl != nil { return *x.DeprecationUrl } return "" } func (x *AttrSpec) GetCssDeclaration() []*CssDeclaration { if x != nil { return x.CssDeclaration } return nil } func (x *AttrSpec) GetDispatchKey() AttrSpec_DispatchKeyType { if x != nil && x.DispatchKey != nil { return *x.DispatchKey } return Default_AttrSpec_DispatchKey } func (x *AttrSpec) GetImplicit() bool { if x != nil && x.Implicit != nil { return *x.Implicit } return Default_AttrSpec_Implicit } func (x *AttrSpec) GetRequiresExtension() []string { if x != nil { return x.RequiresExtension } return nil } func (x *AttrSpec) GetRequiresAncestor() *AncestorMarker { if x != nil { return x.RequiresAncestor } return nil } // Some tags share several attributes, so they're identified by unique key // (see the attr_lists map in ValidatorRules). // NEXT AVAILABLE TAG: 3 type AttrList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Attrs []*AttrSpec `protobuf:"bytes,2,rep,name=attrs" json:"attrs,omitempty"` } func (x *AttrList) Reset() { *x = AttrList{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AttrList) String() string { return protoimpl.X.MessageStringOf(x) } func (*AttrList) ProtoMessage() {} func (x *AttrList) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AttrList.ProtoReflect.Descriptor instead. func (*AttrList) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{6} } func (x *AttrList) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *AttrList) GetAttrs() []*AttrSpec { if x != nil { return x.Attrs } return nil } // A list of allowed tags for descendants of any level (children, grandchildren, // great-grandchildren, etc). // NEXT AVAILABLE TAG: 3 type DescendantTagList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Tag []string `protobuf:"bytes,2,rep,name=tag" json:"tag,omitempty"` } func (x *DescendantTagList) Reset() { *x = DescendantTagList{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DescendantTagList) String() string { return protoimpl.X.MessageStringOf(x) } func (*DescendantTagList) ProtoMessage() {} func (x *DescendantTagList) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DescendantTagList.ProtoReflect.Descriptor instead. func (*DescendantTagList) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{7} } func (x *DescendantTagList) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *DescendantTagList) GetTag() []string { if x != nil { return x.Tag } return nil } // Some style blocks share long lists of declarations, so they're identified by // unique key. // NEXT AVAILABLE TAG: 3 type DeclarationList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Declaration []*CssDeclaration `protobuf:"bytes,2,rep,name=declaration" json:"declaration,omitempty"` } func (x *DeclarationList) Reset() { *x = DeclarationList{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DeclarationList) String() string { return protoimpl.X.MessageStringOf(x) } func (*DeclarationList) ProtoMessage() {} func (x *DeclarationList) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DeclarationList.ProtoReflect.Descriptor instead. func (*DeclarationList) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{8} } func (x *DeclarationList) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *DeclarationList) GetDeclaration() []*CssDeclaration { if x != nil { return x.Declaration } return nil } // Regex which, if matches the cdata of a tag, causes the tag validation to // fail. // NEXT AVAILABLE TAG: 3 type DisallowedCDataRegex struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Syntax is partial match, use ^ and $ if you want global match. Regex *string `protobuf:"bytes,1,opt,name=regex" json:"regex,omitempty"` ErrorMessage *string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage" json:"error_message,omitempty"` } func (x *DisallowedCDataRegex) Reset() { *x = DisallowedCDataRegex{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DisallowedCDataRegex) String() string { return protoimpl.X.MessageStringOf(x) } func (*DisallowedCDataRegex) ProtoMessage() {} func (x *DisallowedCDataRegex) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DisallowedCDataRegex.ProtoReflect.Descriptor instead. func (*DisallowedCDataRegex) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{9} } func (x *DisallowedCDataRegex) GetRegex() string { if x != nil && x.Regex != nil { return *x.Regex } return "" } func (x *DisallowedCDataRegex) GetErrorMessage() string { if x != nil && x.ErrorMessage != nil { return *x.ErrorMessage } return "" } // This spec is used when parsing a media query inside a CSS @media rule. // NEXT AVAILABLE TAG: 5 type MediaQuerySpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // If issues_as_error is true, then parsing errors and invalid // types / features will be treated as validator errors, otherwise warnings. IssuesAsError *bool `protobuf:"varint,1,opt,name=issues_as_error,json=issuesAsError,def=0" json:"issues_as_error,omitempty"` // These are the media query types and features allowed within the stylesheet. // http://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries#Syntax Type []string `protobuf:"bytes,2,rep,name=type" json:"type,omitempty"` Feature []string `protobuf:"bytes,3,rep,name=feature" json:"feature,omitempty"` } // Default values for MediaQuerySpec fields. const ( Default_MediaQuerySpec_IssuesAsError = bool(false) ) func (x *MediaQuerySpec) Reset() { *x = MediaQuerySpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MediaQuerySpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*MediaQuerySpec) ProtoMessage() {} func (x *MediaQuerySpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MediaQuerySpec.ProtoReflect.Descriptor instead. func (*MediaQuerySpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{10} } func (x *MediaQuerySpec) GetIssuesAsError() bool { if x != nil && x.IssuesAsError != nil { return *x.IssuesAsError } return Default_MediaQuerySpec_IssuesAsError } func (x *MediaQuerySpec) GetType() []string { if x != nil { return x.Type } return nil } func (x *MediaQuerySpec) GetFeature() []string { if x != nil { return x.Feature } return nil } // This spec is used when parsing a CSS selector group as the prelude of a CSS // qualified rule. For example "div.foo span.bar". If no SelectorSpec is // provided, the selector groups are unconstrained. // NEXT AVAILABLE TAG: 4 type SelectorSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Allowed attribute selector names. For example `foo` in the selector // `.a[foo=bar]`. AttributeName []string `protobuf:"bytes,1,rep,name=attribute_name,json=attributeName" json:"attribute_name,omitempty"` // Allowed pseudo class names. For example `checked` in `.a:checked`. PseudoClass []string `protobuf:"bytes,2,rep,name=pseudo_class,json=pseudoClass" json:"pseudo_class,omitempty"` // Allowed pseudo element names. For example `before` in `.a::before`. PseudoElement []string `protobuf:"bytes,3,rep,name=pseudo_element,json=pseudoElement" json:"pseudo_element,omitempty"` } func (x *SelectorSpec) Reset() { *x = SelectorSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SelectorSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*SelectorSpec) ProtoMessage() {} func (x *SelectorSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SelectorSpec.ProtoReflect.Descriptor instead. func (*SelectorSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{11} } func (x *SelectorSpec) GetAttributeName() []string { if x != nil { return x.AttributeName } return nil } func (x *SelectorSpec) GetPseudoClass() []string { if x != nil { return x.PseudoClass } return nil } func (x *SelectorSpec) GetPseudoElement() []string { if x != nil { return x.PseudoElement } return nil } // This spec is used by our CSS parser to determine what AT rules are allowed // in the CSS spec. The term 'rule' here refers to the AT Rule in CSS, not a // validation rule. // NEXT AVAILABLE TAG: 4 type AtRuleSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Name of the AT rule to parse. Do not include the '@' symbol (e.g. '@media' // should be encoded as 'media'. Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // A MediaQuerySpec may only be set for an AtRuleSpec with the name // "media". If not set, media queries will be left unparsed, so no errors or // warnings about them will be reported. MediaQuerySpec *MediaQuerySpec `protobuf:"bytes,3,opt,name=media_query_spec,json=mediaQuerySpec" json:"media_query_spec,omitempty"` } func (x *AtRuleSpec) Reset() { *x = AtRuleSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AtRuleSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*AtRuleSpec) ProtoMessage() {} func (x *AtRuleSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AtRuleSpec.ProtoReflect.Descriptor instead. func (*AtRuleSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{12} } func (x *AtRuleSpec) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *AtRuleSpec) GetMediaQuerySpec() *MediaQuerySpec { if x != nil { return x.MediaQuerySpec } return nil } // NEXT AVAILABLE TAG: 10 type CssSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Spec for how to parse CSS AT rules, one per AT rule. Must not contain // duplicate names, and must contain at least one entry for the default. AtRuleSpec []*AtRuleSpec `protobuf:"bytes,1,rep,name=at_rule_spec,json=atRuleSpec" json:"at_rule_spec,omitempty"` // Enables checks specific to the draft A4A specification. // TODO(powdercloud): Make this more generic. ValidateAmp4Ads *bool `protobuf:"varint,5,opt,name=validate_amp4ads,json=validateAmp4ads" json:"validate_amp4ads,omitempty"` // Enables checks specific to the style[keyframes] specification. // TODO(chenshay): Make this more generic. ValidateKeyframes *bool `protobuf:"varint,6,opt,name=validate_keyframes,json=validateKeyframes" json:"validate_keyframes,omitempty"` // Any declaration listed here are allowed. Declaration []string `protobuf:"bytes,7,rep,name=declaration" json:"declaration,omitempty"` // If false, declarations tagged with `!important` are considered errors. // Most AMP stylesheets disallow `!important` to reserve this override // for AMP's own styles. AllowImportant *bool `protobuf:"varint,8,opt,name=allow_important,json=allowImportant,def=0" json:"allow_important,omitempty"` SelectorSpec *SelectorSpec `protobuf:"bytes,9,opt,name=selector_spec,json=selectorSpec" json:"selector_spec,omitempty"` } // Default values for CssSpec fields. const ( Default_CssSpec_AllowImportant = bool(false) ) func (x *CssSpec) Reset() { *x = CssSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *CssSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*CssSpec) ProtoMessage() {} func (x *CssSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CssSpec.ProtoReflect.Descriptor instead. func (*CssSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{13} } func (x *CssSpec) GetAtRuleSpec() []*AtRuleSpec { if x != nil { return x.AtRuleSpec } return nil } func (x *CssSpec) GetValidateAmp4Ads() bool { if x != nil && x.ValidateAmp4Ads != nil { return *x.ValidateAmp4Ads } return false } func (x *CssSpec) GetValidateKeyframes() bool { if x != nil && x.ValidateKeyframes != nil { return *x.ValidateKeyframes } return false } func (x *CssSpec) GetDeclaration() []string { if x != nil { return x.Declaration } return nil } func (x *CssSpec) GetAllowImportant() bool { if x != nil && x.AllowImportant != nil { return *x.AllowImportant } return Default_CssSpec_AllowImportant } func (x *CssSpec) GetSelectorSpec() *SelectorSpec { if x != nil { return x.SelectorSpec } return nil } // NEXT AVAILABLE TAG: 12 type CdataSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // If set, the cdata contents cannot be greater than this length, in bytes. A // value of -2 (default) indicates that there is no limit (unlimited). A value // of -1 will always cause validation failure on match. -1 is used to // implement the `amp-custom-length-check` attribute: // (https://github.com/ampproject/amphtml/issues/22315#issuecomment-496681165) MaxBytes *int32 `protobuf:"varint,1,opt,name=max_bytes,json=maxBytes,def=-2" json:"max_bytes,omitempty"` // If provided, a URL which linking to a section / sentence in the // AMP HTML spec. MaxBytesSpecUrl *string `protobuf:"bytes,2,opt,name=max_bytes_spec_url,json=maxBytesSpecUrl" json:"max_bytes_spec_url,omitempty"` // If non-empty, the text between the start / end tag must match this value. MandatoryCdata *string `protobuf:"bytes,3,opt,name=mandatory_cdata,json=mandatoryCdata" json:"mandatory_cdata,omitempty"` // If non-empty, the text between the start / end tag must match this regex. CdataRegex *string `protobuf:"bytes,6,opt,name=cdata_regex,json=cdataRegex" json:"cdata_regex,omitempty"` // If at least one CssSpec is provided, this cdata field will be parsed // as CSS3, and any parsing errors will become validation errors. CssSpec *CssSpec `protobuf:"bytes,7,opt,name=css_spec,json=cssSpec" json:"css_spec,omitempty"` // If set to true, then only whitespace may be in the cdata contents. // This is useful for script tags that reference extensions etc. WhitespaceOnly *bool `protobuf:"varint,8,opt,name=whitespace_only,json=whitespaceOnly" json:"whitespace_only,omitempty"` // } end oneof // If any of these regexes match, then this cdata spec does not validate. DisallowedCdataRegex []*DisallowedCDataRegex `protobuf:"bytes,4,rep,name=disallowed_cdata_regex,json=disallowedCdataRegex" json:"disallowed_cdata_regex,omitempty"` // If true, the contents of this tag's CDATA text will be counted against the // document level DocCssSpec CSS lengths. DocCssBytes *bool `protobuf:"varint,11,opt,name=doc_css_bytes,json=docCssBytes" json:"doc_css_bytes,omitempty"` } // Default values for CdataSpec fields. const ( Default_CdataSpec_MaxBytes = int32(-2) ) func (x *CdataSpec) Reset() { *x = CdataSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *CdataSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*CdataSpec) ProtoMessage() {} func (x *CdataSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CdataSpec.ProtoReflect.Descriptor instead. func (*CdataSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{14} } func (x *CdataSpec) GetMaxBytes() int32 { if x != nil && x.MaxBytes != nil { return *x.MaxBytes } return Default_CdataSpec_MaxBytes } func (x *CdataSpec) GetMaxBytesSpecUrl() string { if x != nil && x.MaxBytesSpecUrl != nil { return *x.MaxBytesSpecUrl } return "" } func (x *CdataSpec) GetMandatoryCdata() string { if x != nil && x.MandatoryCdata != nil { return *x.MandatoryCdata } return "" } func (x *CdataSpec) GetCdataRegex() string { if x != nil && x.CdataRegex != nil { return *x.CdataRegex } return "" } func (x *CdataSpec) GetCssSpec() *CssSpec { if x != nil { return x.CssSpec } return nil } func (x *CdataSpec) GetWhitespaceOnly() bool { if x != nil && x.WhitespaceOnly != nil { return *x.WhitespaceOnly } return false } func (x *CdataSpec) GetDisallowedCdataRegex() []*DisallowedCDataRegex { if x != nil { return x.DisallowedCdataRegex } return nil } func (x *CdataSpec) GetDocCssBytes() bool { if x != nil && x.DocCssBytes != nil { return *x.DocCssBytes } return false } // Specifies which AMP Layouts are supported by a given element. // For the purpose of the validator, this specifies which // values for layout, height, and width attributes are allowed. Also see // https://github.com/ampproject/amphtml/blob/main/docs/spec/amp-html-layout.md // TODO(johannes): Make the error messages around layouts better. This // may require revamping the documentation for elements and/or the above spec, // so that a user gets more clearly informed about which layouts are // applicable to a given tag, what happens when layout attribute or other // attributes are not set, etc. // NEXT AVAILABLE TAG: 4 type AmpLayout struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Specifies which layouts are supported by this element. SupportedLayouts []AmpLayout_Layout `protobuf:"varint,1,rep,name=supported_layouts,json=supportedLayouts,enum=amp.validator.AmpLayout_Layout" json:"supported_layouts,omitempty"` // Specifies whether this element has default dimensions. This corresponds // to being allowlisted in naturalDimensions_ in // https://github.com/ampproject/amphtml/blob/main/src/static-layout.js. DefinesDefaultWidth *bool `protobuf:"varint,2,opt,name=defines_default_width,json=definesDefaultWidth" json:"defines_default_width,omitempty"` DefinesDefaultHeight *bool `protobuf:"varint,3,opt,name=defines_default_height,json=definesDefaultHeight" json:"defines_default_height,omitempty"` } func (x *AmpLayout) Reset() { *x = AmpLayout{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AmpLayout) String() string { return protoimpl.X.MessageStringOf(x) } func (*AmpLayout) ProtoMessage() {} func (x *AmpLayout) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AmpLayout.ProtoReflect.Descriptor instead. func (*AmpLayout) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{15} } func (x *AmpLayout) GetSupportedLayouts() []AmpLayout_Layout { if x != nil { return x.SupportedLayouts } return nil } func (x *AmpLayout) GetDefinesDefaultWidth() bool { if x != nil && x.DefinesDefaultWidth != nil { return *x.DefinesDefaultWidth } return false } func (x *AmpLayout) GetDefinesDefaultHeight() bool { if x != nil && x.DefinesDefaultHeight != nil { return *x.DefinesDefaultHeight } return false } // An AncestorMarker is a state maintained on the stack of matching tags. // When a TagSpec with an AncestorMarker matches, this Marker is placed on the // stack until the matched html tag is popped from the stack. Other rules may be // triggered by the presence of a specific AncestorMarker on the stack. // NEXT AVAILABLE TAG: 2 type AncestorMarker struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Marker []AncestorMarker_Marker `protobuf:"varint,1,rep,name=marker,enum=amp.validator.AncestorMarker_Marker" json:"marker,omitempty"` } func (x *AncestorMarker) Reset() { *x = AncestorMarker{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AncestorMarker) String() string { return protoimpl.X.MessageStringOf(x) } func (*AncestorMarker) ProtoMessage() {} func (x *AncestorMarker) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AncestorMarker.ProtoReflect.Descriptor instead. func (*AncestorMarker) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{16} } func (x *AncestorMarker) GetMarker() []AncestorMarker_Marker { if x != nil { return x.Marker } return nil } // TagSpec::child_tags uses this configuration to specify which child tags // are expected for a specific tag. // // Matching child tags is done by tag name, while the parent is // matched by TagSpec. The reason for this is that matching by tag // spec name would produce less useful error messages, because we want // to be able to produce a good message even if the tag spec name // could not be determined because the enclosed child tag is invalid // (no TagSpec matches). By doing a tag name match, we can produce a // reasonable error regardless if a child tag was misplaced. // NEXT AVAILABLE TAG: 5 type ChildTagSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Unless set to -1 (the default), the parent tag must have exactly // |mandatory_num_child_tags| immediate child tags. MandatoryNumChildTags *int32 `protobuf:"varint,1,opt,name=mandatory_num_child_tags,json=mandatoryNumChildTags,def=-1" json:"mandatory_num_child_tags,omitempty"` // If at least one tag name is specified, then the first child of the // parent tag must have one of the provided names. FirstChildTagNameOneof []string `protobuf:"bytes,2,rep,name=first_child_tag_name_oneof,json=firstChildTagNameOneof" json:"first_child_tag_name_oneof,omitempty"` // If at least one tag name is specified, then the child tags of // the parent tag must have one of the provided tag names. ChildTagNameOneof []string `protobuf:"bytes,3,rep,name=child_tag_name_oneof,json=childTagNameOneof" json:"child_tag_name_oneof,omitempty"` // Unless set to -1 (the default), the parent tag must have a minimum of // |mandatory_min_num_child_tags| immediate child tags. MandatoryMinNumChildTags *int32 `protobuf:"varint,4,opt,name=mandatory_min_num_child_tags,json=mandatoryMinNumChildTags,def=-1" json:"mandatory_min_num_child_tags,omitempty"` } // Default values for ChildTagSpec fields. const ( Default_ChildTagSpec_MandatoryNumChildTags = int32(-1) Default_ChildTagSpec_MandatoryMinNumChildTags = int32(-1) ) func (x *ChildTagSpec) Reset() { *x = ChildTagSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ChildTagSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*ChildTagSpec) ProtoMessage() {} func (x *ChildTagSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ChildTagSpec.ProtoReflect.Descriptor instead. func (*ChildTagSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{17} } func (x *ChildTagSpec) GetMandatoryNumChildTags() int32 { if x != nil && x.MandatoryNumChildTags != nil { return *x.MandatoryNumChildTags } return Default_ChildTagSpec_MandatoryNumChildTags } func (x *ChildTagSpec) GetFirstChildTagNameOneof() []string { if x != nil { return x.FirstChildTagNameOneof } return nil } func (x *ChildTagSpec) GetChildTagNameOneof() []string { if x != nil { return x.ChildTagNameOneof } return nil } func (x *ChildTagSpec) GetMandatoryMinNumChildTags() int32 { if x != nil && x.MandatoryMinNumChildTags != nil { return *x.MandatoryMinNumChildTags } return Default_ChildTagSpec_MandatoryMinNumChildTags } // TagSpecs and reference points. // // Any TagSpec may define a list of reference points via the // TagSpec::reference_points field. These reference points specify how // DOM elements that are children of this parent tag fulfill particular // functionality. For instance, a widget (implemented as an AMP tag) may // require a login reference point. Any valid AMP tag would be allowed, // whether it's a clickable DIV or an AMP-IMG or a BUTTON, so long as // it *also* conforms to the reference point specification. This // specification is a TagSpec which does not define a name (the // name is set to the special value '$REFERENCE_POINT'), but rather // identifies the reference point with AttrSpec requirements. For instance, // the login reference point may require that there be a login attribute, // or some end-point attribute with a URL, or similar. // Therefore, for any child tags of a tag that defines reference points, // they are first matched against these reference points, and only // then are they validated as regular tags against the TagSpecs that are // not reference points while their reference point attributes are skipped. // The complexity of this mechanism is unfortunate but reduces the markup // required and makes CSS styling more convenient. Please see // the amp-live-list specification for an example. // NEXT AVAILABLE TAG: 4 type ReferencePoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // A tag spec identified by its TagSpec::spec_name which specifies how // a specific functionality for the parent tag is assigned. TagSpecName *string `protobuf:"bytes,1,opt,name=tag_spec_name,json=tagSpecName" json:"tag_spec_name,omitempty"` // At least one of the child tags of the parent defining this // reference point must match it. Mandatory *bool `protobuf:"varint,2,opt,name=mandatory" json:"mandatory,omitempty"` // At most one of the child tags of the parent defining this // reference point must match it. Unique *bool `protobuf:"varint,3,opt,name=unique" json:"unique,omitempty"` } func (x *ReferencePoint) Reset() { *x = ReferencePoint{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ReferencePoint) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReferencePoint) ProtoMessage() {} func (x *ReferencePoint) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReferencePoint.ProtoReflect.Descriptor instead. func (*ReferencePoint) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{18} } func (x *ReferencePoint) GetTagSpecName() string { if x != nil && x.TagSpecName != nil { return *x.TagSpecName } return "" } func (x *ReferencePoint) GetMandatory() bool { if x != nil && x.Mandatory != nil { return *x.Mandatory } return false } func (x *ReferencePoint) GetUnique() bool { if x != nil && x.Unique != nil { return *x.Unique } return false } // Specs specific to AMP Extensions. This is a field within TagSpec that // replaces the standard tagspec list of attributes, requirements, etc. // NEXT AVAILABLE TAG: 11 type ExtensionSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // e.g. "amp-video". This is used both as the attribute value for the // 'custom-element' attribute value as well as part of the 'src' attribute // value. Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // e.g. "0.1", "1.0", "latest". Version []string `protobuf:"bytes,2,rep,name=version" json:"version,omitempty"` // If multiple TagSpecs for the same extension exist, separated by version, // specify a version_name string to disambiguate their spec_names. For // example, "v1.0" or "v0.1-0.2". This string will become part of the name // used for referring to this extension in validator error messages. VersionName *string `protobuf:"bytes,9,opt,name=version_name,json=versionName" json:"version_name,omitempty"` // deprecated_version must be a strict subset of version. If the version // matches a deprecated_version, validation will emit a warning. DeprecatedVersion []string `protobuf:"bytes,3,rep,name=deprecated_version,json=deprecatedVersion" json:"deprecated_version,omitempty"` // Bento supported versions (e.g. "1.0"). BentoSupportedVersion []string `protobuf:"bytes,10,rep,name=bento_supported_version,json=bentoSupportedVersion" json:"bento_supported_version,omitempty"` ExtensionType *ExtensionSpec_ExtensionType `protobuf:"varint,8,opt,name=extension_type,json=extensionType,enum=amp.validator.ExtensionSpec_ExtensionType,def=1" json:"extension_type,omitempty"` // For older tags, we did not originally require that the tag only be included // once, so those tags are exempted from the multiple inclusion ban. DeprecatedAllowDuplicates *bool `protobuf:"varint,6,opt,name=deprecated_allow_duplicates,json=deprecatedAllowDuplicates,def=0" json:"deprecated_allow_duplicates,omitempty"` RequiresUsage *ExtensionSpec_ExtensionUsageRequirement `protobuf:"varint,7,opt,name=requires_usage,json=requiresUsage,enum=amp.validator.ExtensionSpec_ExtensionUsageRequirement,def=1" json:"requires_usage,omitempty"` } // Default values for ExtensionSpec fields. const ( Default_ExtensionSpec_ExtensionType = ExtensionSpec_CUSTOM_ELEMENT Default_ExtensionSpec_DeprecatedAllowDuplicates = bool(false) Default_ExtensionSpec_RequiresUsage = ExtensionSpec_ERROR ) func (x *ExtensionSpec) Reset() { *x = ExtensionSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ExtensionSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*ExtensionSpec) ProtoMessage() {} func (x *ExtensionSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ExtensionSpec.ProtoReflect.Descriptor instead. func (*ExtensionSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{19} } func (x *ExtensionSpec) GetName() string { if x != nil && x.Name != nil { return *x.Name } return "" } func (x *ExtensionSpec) GetVersion() []string { if x != nil { return x.Version } return nil } func (x *ExtensionSpec) GetVersionName() string { if x != nil && x.VersionName != nil { return *x.VersionName } return "" } func (x *ExtensionSpec) GetDeprecatedVersion() []string { if x != nil { return x.DeprecatedVersion } return nil } func (x *ExtensionSpec) GetBentoSupportedVersion() []string { if x != nil { return x.BentoSupportedVersion } return nil } func (x *ExtensionSpec) GetExtensionType() ExtensionSpec_ExtensionType { if x != nil && x.ExtensionType != nil { return *x.ExtensionType } return Default_ExtensionSpec_ExtensionType } func (x *ExtensionSpec) GetDeprecatedAllowDuplicates() bool { if x != nil && x.DeprecatedAllowDuplicates != nil { return *x.DeprecatedAllowDuplicates } return Default_ExtensionSpec_DeprecatedAllowDuplicates } func (x *ExtensionSpec) GetRequiresUsage() ExtensionSpec_ExtensionUsageRequirement { if x != nil && x.RequiresUsage != nil { return *x.RequiresUsage } return Default_ExtensionSpec_RequiresUsage } // The HtmlFormat is the declared format in the top-level html tag, which // prescribes a particular set of validation rules. This should be kept in sync // with Request.HtmlFormat in // github.com/ampproject/amppackager/transformer/request/request.proto. type HtmlFormat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *HtmlFormat) Reset() { *x = HtmlFormat{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *HtmlFormat) String() string { return protoimpl.X.MessageStringOf(x) } func (*HtmlFormat) ProtoMessage() {} func (x *HtmlFormat) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use HtmlFormat.ProtoReflect.Descriptor instead. func (*HtmlFormat) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{20} } // Tags that are not covered by at least one of these specs are disallowed. // Some tags are mandatory. Note that the tag name is not unique, that is, // there can be multiple tag specs covering the same name, e.g., for // multiple meta tags (with different attributes). // NEXT AVAILABLE TAG: 40 type TagSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The html_format field tells the validator for which html formats // (ie: (<html ⚡> vs <html a4⚡>) this HTML TagSpec is allowed to validate. // The repeated field is not allowed to be empty, it must have at least one // HtmlFormat. HtmlFormat []HtmlFormat_Code `protobuf:"varint,21,rep,name=html_format,json=htmlFormat,enum=amp.validator.HtmlFormat_Code" json:"html_format,omitempty"` // If provided, the Type Identifier(s) that either enable or disable // this TagSpec. If a Type Identifier is in `enabled_by` then this // TagSpec will be used in validating parsed documents which include that Type // Identifier. If a Type Identifier is in `disabled_by` then this // TagSpec will not be used in validating parsed documents which include that // Type Identifier. A TagSpec can not have both `enabled_by` and `disabled_by` // set. EnabledBy []string `protobuf:"bytes,35,rep,name=enabled_by,json=enabledBy" json:"enabled_by,omitempty"` DisabledBy []string `protobuf:"bytes,36,rep,name=disabled_by,json=disabledBy" json:"disabled_by,omitempty"` // Use UPPER-CASE tag names only. If adding the same tag twice, then they must // also have a spec_name string which is unique throughout all detail. // Note: "$REFERENCE_POINT" is a special tag_name value. // Reference points are partial tag specs which don't have a defined // tag_name. TagName *string `protobuf:"bytes,1,opt,name=tag_name,json=tagName" json:"tag_name,omitempty"` // If provided, the spec_name must be unique within the validator // rules. This string forms a a unique id for this TagSpec. If not set, the // tag_name field is used as the unique id. This string is not used in error // messages, see descriptive_name for that. SpecName *string `protobuf:"bytes,2,opt,name=spec_name,json=specName" json:"spec_name,omitempty"` // If `tag_name` is not a sufficient descriptor for error messages having to // do with this tag spec, provide a `descriptive_name` value, which if present // will be used in place of `tag_name`. Typically `descriptive_name` should // include the tag_name in it, and should avoid using < and > in case // downstream libraries of the validator fail to properly HTML escape rendered // error strings. DescriptiveName *string `protobuf:"bytes,39,opt,name=descriptive_name,json=descriptiveName" json:"descriptive_name,omitempty"` NamedId *TagSpec_NamedId `protobuf:"varint,33,opt,name=named_id,json=namedId,enum=amp.validator.TagSpec_NamedId,def=0" json:"named_id,omitempty"` // If provided, this is a SCRIPT tag defining an amp custom element // extension. The other fields, such as expected attributes, will be // validated by the extension spec rules. ExtensionSpec *ExtensionSpec `protobuf:"bytes,27,opt,name=extension_spec,json=extensionSpec" json:"extension_spec,omitempty"` // If set, this tag is considered part of an amp extended component, and // requires that the named extended component script tag is present on the // page. RequiresExtension []string `protobuf:"bytes,28,rep,name=requires_extension,json=requiresExtension" json:"requires_extension,omitempty"` // If true, a tag conforming to this tag spec must occur at least once // within the document. Mandatory *bool `protobuf:"varint,3,opt,name=mandatory" json:"mandatory,omitempty"` // A string identifying that this tag belongs to a set of alternative // choices from which at least one needs to be satisfied. MandatoryAlternatives *string `protobuf:"bytes,4,opt,name=mandatory_alternatives,json=mandatoryAlternatives" json:"mandatory_alternatives,omitempty"` // If true, a tag conforming to this tag spec may occur at most once within // the document. Unique *bool `protobuf:"varint,5,opt,name=unique" json:"unique,omitempty"` // If true, a tag conforming to this tag spec should occur at most once within // the document. That is, unlike for unique, we'll emit a warning. UniqueWarning *bool `protobuf:"varint,25,opt,name=unique_warning,json=uniqueWarning" json:"unique_warning,omitempty"` // If set to "$ROOT", this tag must be the root tag. // If set to any other string, the tag must be the direct child of the // specified mandatory parent tag. MandatoryParent *string `protobuf:"bytes,6,opt,name=mandatory_parent,json=mandatoryParent" json:"mandatory_parent,omitempty"` // If set, the tag must descend from (not necessarily direct parent of) the // specified mandatory parent string which is either a tag name or a tag // spec_name (e.g. tag.name = "!DOCTYPE" or tag.spec_name = "html doctype"). MandatoryAncestor *string `protobuf:"bytes,15,opt,name=mandatory_ancestor,json=mandatoryAncestor" json:"mandatory_ancestor,omitempty"` // Use only for tags where mandatory_ancestor is set. If tag validation fails // due to the mandatory_ancestor, and this field is set, then the error // detail will suggest the tag specified here as an alternative to consider. MandatoryAncestorSuggestedAlternative *string `protobuf:"bytes,16,opt,name=mandatory_ancestor_suggested_alternative,json=mandatoryAncestorSuggestedAlternative" json:"mandatory_ancestor_suggested_alternative,omitempty"` // This tag may not descend from any tag with any of these tag names or tag // spec_names (e.g. tag.name = "!DOCTYPE" or tag.spec_name = "html doctype"). DisallowedAncestor []string `protobuf:"bytes,13,rep,name=disallowed_ancestor,json=disallowedAncestor" json:"disallowed_ancestor,omitempty"` // If set, all of the tag's descendants must be tags from the named list. // A tag not in the named list will generate an error. DescendantTagList *string `protobuf:"bytes,29,opt,name=descendant_tag_list,json=descendantTagList" json:"descendant_tag_list,omitempty"` // If set, other tags - identified by their detail string - must be // present as well or a warning will be issued (will not invalidate doc). AlsoRequiresTagWarning []string `protobuf:"bytes,22,rep,name=also_requires_tag_warning,json=alsoRequiresTagWarning" json:"also_requires_tag_warning,omitempty"` // Expresses a generic condition which is satisfied if this tag is found. Used // in combination with the `requires` attribute on a different tag. SatisfiesCondition []string `protobuf:"bytes,23,rep,name=satisfies_condition" json:"satisfies_condition,omitempty"` // Expresses a generic condition which must be satisfied if this tag is found. // Used in combination with the `satisfies` attributes on a different tag. RequiresCondition []string `protobuf:"bytes,24,rep,name=requires_condition" json:"requires_condition,omitempty"` // The excludes field is a generic condition, which must not be satisfied if // this tag is found. Otherwise a TAG_EXCLUDED_BY_TAG error will be generated. // Used in combination with the `satisfies` attributes on a different tag. ExcludesCondition []string `protobuf:"bytes,32,rep,name=excludes_condition" json:"excludes_condition,omitempty"` // If set, generates a DEPRECATED_TAG error with severity WARNING. // The value of the deprecation field indicates what to use instead, // e.g. the name of a tag. Deprecation *string `protobuf:"bytes,17,opt,name=deprecation" json:"deprecation,omitempty"` // If provided, a URL which links to the AMP HTML spec for this deprecation. DeprecationUrl *string `protobuf:"bytes,18,opt,name=deprecation_url,json=deprecationUrl" json:"deprecation_url,omitempty"` // This TagSpec will only validate against attributes explicitly // listed within the TagSpec (attrs and attr_lists). No attributes // from $GLOBAL_ATTRS and $AMP_LAYOUT_ATTRS are valid unless explicitly // added as an attribute within the TagSpec. The field `amp_layout` is not // allowed to be set when `explicit_attrs_only` is true. ExplicitAttrsOnly *bool `protobuf:"varint,34,opt,name=explicit_attrs_only,json=explicitAttrsOnly,def=0" json:"explicit_attrs_only,omitempty"` // Attribute specifications related to this tag. Attrs []*AttrSpec `protobuf:"bytes,7,rep,name=attrs" json:"attrs,omitempty"` // Top level attr lists of shared tags, identified by unique key // (see attr_lists map in ValidatorRules). AttrLists []string `protobuf:"bytes,8,rep,name=attr_lists,json=attrLists" json:"attr_lists,omitempty"` // Note that these are evaluated after a particular TagSpec // has been evaluated. Unlike other checks in this TagSpec, we // no longer have the ability to fall back on a different TagSpec. Cdata *CdataSpec `protobuf:"bytes,12,opt,name=cdata" json:"cdata,omitempty"` // Specifies which tags can be the child tags, that is, immediately children // of this tag in the document. ChildTags *ChildTagSpec `protobuf:"bytes,19,opt,name=child_tags,json=childTags" json:"child_tags,omitempty"` // If set to true, this tag cannot have any siblings. SiblingsDisallowed *bool `protobuf:"varint,30,opt,name=siblings_disallowed,json=siblingsDisallowed,def=0" json:"siblings_disallowed,omitempty"` // If set to true, this tag must be the last child of its parent. MandatoryLastChild *bool `protobuf:"varint,31,opt,name=mandatory_last_child,json=mandatoryLastChild,def=0" json:"mandatory_last_child,omitempty"` // The reference_points defined by this TagSpec instance determine how // specific child tags are identified. Please see the comment for the // ReferencePoint message. ReferencePoints []*ReferencePoint `protobuf:"bytes,20,rep,name=reference_points,json=referencePoints" json:"reference_points,omitempty"` // If provided, a URL which linking to a section / sentence in the // AMP HTML spec. If a TagSpec contains a requires_extension field, // spec_url will be inherited from the named extension, unless overridden // by the setting it here. SpecUrl *string `protobuf:"bytes,10,opt,name=spec_url,json=specUrl" json:"spec_url,omitempty"` // If set, specifies which AMP Layouts are supported by this element. AmpLayout *AmpLayout `protobuf:"bytes,11,opt,name=amp_layout,json=ampLayout" json:"amp_layout,omitempty"` // If set, triggers related validation rules for descendants of this tag. MarkDescendants *AncestorMarker `protobuf:"bytes,38,opt,name=mark_descendants,json=markDescendants" json:"mark_descendants,omitempty"` } // Default values for TagSpec fields. const ( Default_TagSpec_NamedId = TagSpec_NOT_SET Default_TagSpec_ExplicitAttrsOnly = bool(false) Default_TagSpec_SiblingsDisallowed = bool(false) Default_TagSpec_MandatoryLastChild = bool(false) ) func (x *TagSpec) Reset() { *x = TagSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *TagSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*TagSpec) ProtoMessage() {} func (x *TagSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TagSpec.ProtoReflect.Descriptor instead. func (*TagSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{21} } func (x *TagSpec) GetHtmlFormat() []HtmlFormat_Code { if x != nil { return x.HtmlFormat } return nil } func (x *TagSpec) GetEnabledBy() []string { if x != nil { return x.EnabledBy } return nil } func (x *TagSpec) GetDisabledBy() []string { if x != nil { return x.DisabledBy } return nil } func (x *TagSpec) GetTagName() string { if x != nil && x.TagName != nil { return *x.TagName } return "" } func (x *TagSpec) GetSpecName() string { if x != nil && x.SpecName != nil { return *x.SpecName } return "" } func (x *TagSpec) GetDescriptiveName() string { if x != nil && x.DescriptiveName != nil { return *x.DescriptiveName } return "" } func (x *TagSpec) GetNamedId() TagSpec_NamedId { if x != nil && x.NamedId != nil { return *x.NamedId } return Default_TagSpec_NamedId } func (x *TagSpec) GetExtensionSpec() *ExtensionSpec { if x != nil { return x.ExtensionSpec } return nil } func (x *TagSpec) GetRequiresExtension() []string { if x != nil { return x.RequiresExtension } return nil } func (x *TagSpec) GetMandatory() bool { if x != nil && x.Mandatory != nil { return *x.Mandatory } return false } func (x *TagSpec) GetMandatoryAlternatives() string { if x != nil && x.MandatoryAlternatives != nil { return *x.MandatoryAlternatives } return "" } func (x *TagSpec) GetUnique() bool { if x != nil && x.Unique != nil { return *x.Unique } return false } func (x *TagSpec) GetUniqueWarning() bool { if x != nil && x.UniqueWarning != nil { return *x.UniqueWarning } return false } func (x *TagSpec) GetMandatoryParent() string { if x != nil && x.MandatoryParent != nil { return *x.MandatoryParent } return "" } func (x *TagSpec) GetMandatoryAncestor() string { if x != nil && x.MandatoryAncestor != nil { return *x.MandatoryAncestor } return "" } func (x *TagSpec) GetMandatoryAncestorSuggestedAlternative() string { if x != nil && x.MandatoryAncestorSuggestedAlternative != nil { return *x.MandatoryAncestorSuggestedAlternative } return "" } func (x *TagSpec) GetDisallowedAncestor() []string { if x != nil { return x.DisallowedAncestor } return nil } func (x *TagSpec) GetDescendantTagList() string { if x != nil && x.DescendantTagList != nil { return *x.DescendantTagList } return "" } func (x *TagSpec) GetAlsoRequiresTagWarning() []string { if x != nil { return x.AlsoRequiresTagWarning } return nil } func (x *TagSpec) GetSatisfiesCondition() []string { if x != nil { return x.SatisfiesCondition } return nil } func (x *TagSpec) GetRequiresCondition() []string { if x != nil { return x.RequiresCondition } return nil } func (x *TagSpec) GetExcludesCondition() []string { if x != nil { return x.ExcludesCondition } return nil } func (x *TagSpec) GetDeprecation() string { if x != nil && x.Deprecation != nil { return *x.Deprecation } return "" } func (x *TagSpec) GetDeprecationUrl() string { if x != nil && x.DeprecationUrl != nil { return *x.DeprecationUrl } return "" } func (x *TagSpec) GetExplicitAttrsOnly() bool { if x != nil && x.ExplicitAttrsOnly != nil { return *x.ExplicitAttrsOnly } return Default_TagSpec_ExplicitAttrsOnly } func (x *TagSpec) GetAttrs() []*AttrSpec { if x != nil { return x.Attrs } return nil } func (x *TagSpec) GetAttrLists() []string { if x != nil { return x.AttrLists } return nil } func (x *TagSpec) GetCdata() *CdataSpec { if x != nil { return x.Cdata } return nil } func (x *TagSpec) GetChildTags() *ChildTagSpec { if x != nil { return x.ChildTags } return nil } func (x *TagSpec) GetSiblingsDisallowed() bool { if x != nil && x.SiblingsDisallowed != nil { return *x.SiblingsDisallowed } return Default_TagSpec_SiblingsDisallowed } func (x *TagSpec) GetMandatoryLastChild() bool { if x != nil && x.MandatoryLastChild != nil { return *x.MandatoryLastChild } return Default_TagSpec_MandatoryLastChild } func (x *TagSpec) GetReferencePoints() []*ReferencePoint { if x != nil { return x.ReferencePoints } return nil } func (x *TagSpec) GetSpecUrl() string { if x != nil && x.SpecUrl != nil { return *x.SpecUrl } return "" } func (x *TagSpec) GetAmpLayout() *AmpLayout { if x != nil { return x.AmpLayout } return nil } func (x *TagSpec) GetMarkDescendants() *AncestorMarker { if x != nil { return x.MarkDescendants } return nil } // Exactly one DocSpec will match each AMP document. This spec defines some // default rules for the entire document scoped by it's HtmlFormat and any // Type Identifiers. // NEXT AVAILABLE TAG: 6 type DocSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The html_format field tells the validator for which html formats // (ie: (<html ⚡> vs <html a4⚡>) this DocSpec is defined for. HtmlFormat []HtmlFormat_Code `protobuf:"varint,1,rep,name=html_format,json=htmlFormat,enum=amp.validator.HtmlFormat_Code" json:"html_format,omitempty"` // If a Type Identifier is in enabled_by then this DocSpec will be used // in validating parsed documents with that Type Identifier. If a Type // Identifier is in disabled_by then this DocSpec will not be used in // validating parsed documents with that Type Identifier. An DocSpec can // not have both enabled_by and disabled_by set. EnabledBy []string `protobuf:"bytes,2,rep,name=enabled_by,json=enabledBy" json:"enabled_by,omitempty"` DisabledBy []string `protobuf:"bytes,3,rep,name=disabled_by,json=disabledBy" json:"disabled_by,omitempty"` // If set, the entire document's content cannot be greater than this length, // in bytes. A value of -2 (default) indicates that there is no limit // (unlimited). MaxBytes *int32 `protobuf:"varint,4,opt,name=max_bytes,json=maxBytes,def=-2" json:"max_bytes,omitempty"` // If provided, a URL linking to a section / sentence in the AMP HTML spec. MaxBytesSpecUrl *string `protobuf:"bytes,5,opt,name=max_bytes_spec_url,json=maxBytesSpecUrl" json:"max_bytes_spec_url,omitempty"` } // Default values for DocSpec fields. const ( Default_DocSpec_MaxBytes = int32(-2) ) func (x *DocSpec) Reset() { *x = DocSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DocSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*DocSpec) ProtoMessage() {} func (x *DocSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DocSpec.ProtoReflect.Descriptor instead. func (*DocSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{22} } func (x *DocSpec) GetHtmlFormat() []HtmlFormat_Code { if x != nil { return x.HtmlFormat } return nil } func (x *DocSpec) GetEnabledBy() []string { if x != nil { return x.EnabledBy } return nil } func (x *DocSpec) GetDisabledBy() []string { if x != nil { return x.DisabledBy } return nil } func (x *DocSpec) GetMaxBytes() int32 { if x != nil && x.MaxBytes != nil { return *x.MaxBytes } return Default_DocSpec_MaxBytes } func (x *DocSpec) GetMaxBytesSpecUrl() string { if x != nil && x.MaxBytesSpecUrl != nil { return *x.MaxBytesSpecUrl } return "" } // Exactly one DocCssSpec will match each AMP document. This spec defines the // default css rules for style attributes and publisher style tags across the // entire document. Rules for specific tags may be overridden by those tags. // NEXT AVAILABLE TAG: 20 type DocCssSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The html_format field tells the validator for which html formats // (ie: (<html ⚡> vs <html a4⚡>) this DocCssSpec is defined for. HtmlFormat []HtmlFormat_Code `protobuf:"varint,1,rep,name=html_format,json=htmlFormat,enum=amp.validator.HtmlFormat_Code" json:"html_format,omitempty"` // If a Type Identifier is in enabled_by then this DocCssSpec will be used // in validating parsed documents with that Type Identifier. If a Type // Identifier is in disabled_by then this DocCssSpec will not be used in // validating parsed documents;: with that Type Identifier. An DocCssSpec can // not have both enabled_by and disabled_by set. EnabledBy []string `protobuf:"bytes,2,rep,name=enabled_by,json=enabledBy" json:"enabled_by,omitempty"` DisabledBy []string `protobuf:"bytes,3,rep,name=disabled_by,json=disabledBy" json:"disabled_by,omitempty"` // If provided, a URL linking to a section / sentence in the AMP HTML spec. SpecUrl *string `protobuf:"bytes,4,opt,name=spec_url,json=specUrl" json:"spec_url,omitempty"` // Due to a bug, we allowed unlimited doc-level and per-inline-style bytes // for CSS in non-AMP formats. To avoid breaking pages, some formats will // only emit a warning for exceeding `max_bytes` and // `max_bytes_per_inline_style`. MaxBytesIsWarning *bool `protobuf:"varint,18,opt,name=max_bytes_is_warning,json=maxBytesIsWarning,def=0" json:"max_bytes_is_warning,omitempty"` // If set, the combined style amp-custom cdata contents and all inline style // contents cannot be greater than this length, in bytes. A value of -2 // (default) indicates that there is no limit (unlimited). A value of -1 will // always cause validation failure. MaxBytes *int32 `protobuf:"varint,5,opt,name=max_bytes,json=maxBytes,def=-2" json:"max_bytes,omitempty"` // If set, the inline style content (per use) cannot be greater than this // length, in bytes. MaxBytesPerInlineStyle *int32 `protobuf:"varint,6,opt,name=max_bytes_per_inline_style,json=maxBytesPerInlineStyle,def=-1" json:"max_bytes_per_inline_style,omitempty"` // If false, bytes inside URLs are not included in the byte calculation for // `max_bytes`. This is used for handling signed exchange transformations // which can potentially take the number of bytes over the 75,000 byte limit // due to rewriting URLs to point at an AMP Cache. UrlBytesIncluded *bool `protobuf:"varint,7,opt,name=url_bytes_included,json=urlBytesIncluded,def=1" json:"url_bytes_included,omitempty"` // If provided, a URL linking to a section / sentence in the AMP HTML spec. MaxBytesSpecUrl *string `protobuf:"bytes,8,opt,name=max_bytes_spec_url,json=maxBytesSpecUrl" json:"max_bytes_spec_url,omitempty"` // If true, all declarations are allowed in style tags and inline style // attributes, regardless of the contents of the `declaration` list. AllowAllDeclarationInStyle *bool `protobuf:"varint,10,opt,name=allow_all_declaration_in_style,json=allowAllDeclarationInStyle,def=0" json:"allow_all_declaration_in_style,omitempty"` // If true, all variants of declarations that are vendor prefixes are allowed. // for example, if `gradient` is an allowed declaration and this is true, then // `-webkit-gradient` is also an allowed declaration. ExpandVendorPrefixes *bool `protobuf:"varint,19,opt,name=expand_vendor_prefixes,json=expandVendorPrefixes" json:"expand_vendor_prefixes,omitempty"` // Any declaration listed here is allowed in custom style tags and style // attributes in any tag. Declaration []*CssDeclaration `protobuf:"bytes,11,rep,name=declaration" json:"declaration,omitempty"` // In addition to those listed in 'declaration', any declaration listed here // is allowed in style attributes for SVG elements. DeclarationSvg []*CssDeclaration `protobuf:"bytes,12,rep,name=declaration_svg,json=declarationSvg" json:"declaration_svg,omitempty"` // Top level lists of shared declarations, identified by unique key. DeclarationList []string `protobuf:"bytes,13,rep,name=declaration_list,json=declarationList" json:"declaration_list,omitempty"` // Top level lists of shared declarations, identified by unique key. DeclarationListSvg []string `protobuf:"bytes,14,rep,name=declaration_list_svg,json=declarationListSvg" json:"declaration_list_svg,omitempty"` // URLs found within CSS are checked against this spec. ImageUrlSpec *UrlSpec `protobuf:"bytes,15,opt,name=image_url_spec,json=imageUrlSpec" json:"image_url_spec,omitempty"` FontUrlSpec *UrlSpec `protobuf:"bytes,16,opt,name=font_url_spec,json=fontUrlSpec" json:"font_url_spec,omitempty"` // If false, declarations tagged with `!important` are considered errors. // Most AMP stylesheets disallow `!important` to reserve this override // for AMP's own styles. AllowImportant *bool `protobuf:"varint,17,opt,name=allow_important,json=allowImportant,def=0" json:"allow_important,omitempty"` } // Default values for DocCssSpec fields. const ( Default_DocCssSpec_MaxBytesIsWarning = bool(false) Default_DocCssSpec_MaxBytes = int32(-2) Default_DocCssSpec_MaxBytesPerInlineStyle = int32(-1) Default_DocCssSpec_UrlBytesIncluded = bool(true) Default_DocCssSpec_AllowAllDeclarationInStyle = bool(false) Default_DocCssSpec_AllowImportant = bool(false) ) func (x *DocCssSpec) Reset() { *x = DocCssSpec{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DocCssSpec) String() string { return protoimpl.X.MessageStringOf(x) } func (*DocCssSpec) ProtoMessage() {} func (x *DocCssSpec) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DocCssSpec.ProtoReflect.Descriptor instead. func (*DocCssSpec) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{23} } func (x *DocCssSpec) GetHtmlFormat() []HtmlFormat_Code { if x != nil { return x.HtmlFormat } return nil } func (x *DocCssSpec) GetEnabledBy() []string { if x != nil { return x.EnabledBy } return nil } func (x *DocCssSpec) GetDisabledBy() []string { if x != nil { return x.DisabledBy } return nil } func (x *DocCssSpec) GetSpecUrl() string { if x != nil && x.SpecUrl != nil { return *x.SpecUrl } return "" } func (x *DocCssSpec) GetMaxBytesIsWarning() bool { if x != nil && x.MaxBytesIsWarning != nil { return *x.MaxBytesIsWarning } return Default_DocCssSpec_MaxBytesIsWarning } func (x *DocCssSpec) GetMaxBytes() int32 { if x != nil && x.MaxBytes != nil { return *x.MaxBytes } return Default_DocCssSpec_MaxBytes } func (x *DocCssSpec) GetMaxBytesPerInlineStyle() int32 { if x != nil && x.MaxBytesPerInlineStyle != nil { return *x.MaxBytesPerInlineStyle } return Default_DocCssSpec_MaxBytesPerInlineStyle } func (x *DocCssSpec) GetUrlBytesIncluded() bool { if x != nil && x.UrlBytesIncluded != nil { return *x.UrlBytesIncluded } return Default_DocCssSpec_UrlBytesIncluded } func (x *DocCssSpec) GetMaxBytesSpecUrl() string { if x != nil && x.MaxBytesSpecUrl != nil { return *x.MaxBytesSpecUrl } return "" } func (x *DocCssSpec) GetAllowAllDeclarationInStyle() bool { if x != nil && x.AllowAllDeclarationInStyle != nil { return *x.AllowAllDeclarationInStyle } return Default_DocCssSpec_AllowAllDeclarationInStyle } func (x *DocCssSpec) GetExpandVendorPrefixes() bool { if x != nil && x.ExpandVendorPrefixes != nil { return *x.ExpandVendorPrefixes } return false } func (x *DocCssSpec) GetDeclaration() []*CssDeclaration { if x != nil { return x.Declaration } return nil } func (x *DocCssSpec) GetDeclarationSvg() []*CssDeclaration { if x != nil { return x.DeclarationSvg } return nil } func (x *DocCssSpec) GetDeclarationList() []string { if x != nil { return x.DeclarationList } return nil } func (x *DocCssSpec) GetDeclarationListSvg() []string { if x != nil { return x.DeclarationListSvg } return nil } func (x *DocCssSpec) GetImageUrlSpec() *UrlSpec { if x != nil { return x.ImageUrlSpec } return nil } func (x *DocCssSpec) GetFontUrlSpec() *UrlSpec { if x != nil { return x.FontUrlSpec } return nil } func (x *DocCssSpec) GetAllowImportant() bool { if x != nil && x.AllowImportant != nil { return *x.AllowImportant } return Default_DocCssSpec_AllowImportant } // Top level message - start reading here. // The validator knows about a set of tag specifications. // NEXT AVAILABLE TAG: 22 type ValidatorRules struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tags []*TagSpec `protobuf:"bytes,1,rep,name=tags" json:"tags,omitempty"` AttrLists []*AttrList `protobuf:"bytes,7,rep,name=attr_lists,json=attrLists" json:"attr_lists,omitempty"` // The min file revision for validator.cc which can digest this file. // // Deprecated: Do not use. MinValidatorRevisionRequired *int32 `protobuf:"varint,4,opt,name=min_validator_revision_required,json=minValidatorRevisionRequired" json:"min_validator_revision_required,omitempty"` // See comment in validator.protoascii. // // Deprecated: Do not use. SpecFileRevision *int32 `protobuf:"varint,6,opt,name=spec_file_revision,json=specFileRevision,def=-1" json:"spec_file_revision,omitempty"` // Spec URL for information about mustache templates. TemplateSpecUrl *string `protobuf:"bytes,8,opt,name=template_spec_url,json=templateSpecUrl" json:"template_spec_url,omitempty"` // Spec URL for information about styles and amp-custom stylesheet StylesSpecUrl *string `protobuf:"bytes,15,opt,name=styles_spec_url,json=stylesSpecUrl" json:"styles_spec_url,omitempty"` // Spec URL for information about script tags. ScriptSpecUrl *string `protobuf:"bytes,17,opt,name=script_spec_url,json=scriptSpecUrl" json:"script_spec_url,omitempty"` ErrorFormats []*ErrorFormat `protobuf:"bytes,9,rep,name=error_formats,json=errorFormats" json:"error_formats,omitempty"` ErrorSpecificity []*ErrorSpecificity `protobuf:"bytes,13,rep,name=error_specificity,json=errorSpecificity" json:"error_specificity,omitempty"` DescendantTagList []*DescendantTagList `protobuf:"bytes,16,rep,name=descendant_tag_list,json=descendantTagList" json:"descendant_tag_list,omitempty"` // The DocSpec rules are scoped by the document's HtmlFormat and Type // Identifiers and defined within each DocSpec. Doc []*DocSpec `protobuf:"bytes,21,rep,name=doc" json:"doc,omitempty"` Css []*DocCssSpec `protobuf:"bytes,19,rep,name=css" json:"css,omitempty"` DeclarationList []*DeclarationList `protobuf:"bytes,20,rep,name=declaration_list,json=declarationList" json:"declaration_list,omitempty"` } // Default values for ValidatorRules fields. const ( Default_ValidatorRules_SpecFileRevision = int32(-1) ) func (x *ValidatorRules) Reset() { *x = ValidatorRules{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ValidatorRules) String() string { return protoimpl.X.MessageStringOf(x) } func (*ValidatorRules) ProtoMessage() {} func (x *ValidatorRules) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ValidatorRules.ProtoReflect.Descriptor instead. func (*ValidatorRules) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{24} } func (x *ValidatorRules) GetTags() []*TagSpec { if x != nil { return x.Tags } return nil } func (x *ValidatorRules) GetAttrLists() []*AttrList { if x != nil { return x.AttrLists } return nil } // Deprecated: Do not use. func (x *ValidatorRules) GetMinValidatorRevisionRequired() int32 { if x != nil && x.MinValidatorRevisionRequired != nil { return *x.MinValidatorRevisionRequired } return 0 } // Deprecated: Do not use. func (x *ValidatorRules) GetSpecFileRevision() int32 { if x != nil && x.SpecFileRevision != nil { return *x.SpecFileRevision } return Default_ValidatorRules_SpecFileRevision } func (x *ValidatorRules) GetTemplateSpecUrl() string { if x != nil && x.TemplateSpecUrl != nil { return *x.TemplateSpecUrl } return "" } func (x *ValidatorRules) GetStylesSpecUrl() string { if x != nil && x.StylesSpecUrl != nil { return *x.StylesSpecUrl } return "" } func (x *ValidatorRules) GetScriptSpecUrl() string { if x != nil && x.ScriptSpecUrl != nil { return *x.ScriptSpecUrl } return "" } func (x *ValidatorRules) GetErrorFormats() []*ErrorFormat { if x != nil { return x.ErrorFormats } return nil } func (x *ValidatorRules) GetErrorSpecificity() []*ErrorSpecificity { if x != nil { return x.ErrorSpecificity } return nil } func (x *ValidatorRules) GetDescendantTagList() []*DescendantTagList { if x != nil { return x.DescendantTagList } return nil } func (x *ValidatorRules) GetDoc() []*DocSpec { if x != nil { return x.Doc } return nil } func (x *ValidatorRules) GetCss() []*DocCssSpec { if x != nil { return x.Css } return nil } func (x *ValidatorRules) GetDeclarationList() []*DeclarationList { if x != nil { return x.DeclarationList } return nil } // This feature was removed in October 2019, however there are still // some callers that expect an ErrorCategory to be set. Do not rely // on this in new code. // TODO(#25188): Remove ErrorCategory completely. type ErrorCategory struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *ErrorCategory) Reset() { *x = ErrorCategory{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ErrorCategory) String() string { return protoimpl.X.MessageStringOf(x) } func (*ErrorCategory) ProtoMessage() {} func (x *ErrorCategory) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ErrorCategory.ProtoReflect.Descriptor instead. func (*ErrorCategory) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{25} } // We record validation errors in a structured form, so that they can be // worked with in code - e.g., to provide translated messages. // In the Javascript implementation (validator.js), you may find // the amp.validator.renderErrorMessage function which will make a // human-readable string from the structured form. It should be easy to port // this to other languages as needed; for instance Google has implementations // in C++, Java, and for templates used in some frontends. // NEXT AVAILABLE TAG: 10 type ValidationError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Severity *ValidationError_Severity `protobuf:"varint,6,opt,name=severity,enum=amp.validator.ValidationError_Severity,def=1" json:"severity,omitempty"` Code *ValidationError_Code `protobuf:"varint,1,opt,name=code,enum=amp.validator.ValidationError_Code" json:"code,omitempty"` Line *int32 `protobuf:"varint,2,opt,name=line,def=1" json:"line,omitempty"` Col *int32 `protobuf:"varint,3,opt,name=col" json:"col,omitempty"` SpecUrl *string `protobuf:"bytes,5,opt,name=spec_url,json=specUrl" json:"spec_url,omitempty"` Params []string `protobuf:"bytes,7,rep,name=params" json:"params,omitempty"` // This field is deprecated. Do not use. Category *ErrorCategory_Code `protobuf:"varint,8,opt,name=category,enum=amp.validator.ErrorCategory_Code" json:"category,omitempty"` // Used only in JavaScript, if an error is emitted for a specific HTML tag and // if that HTML tag has an attribute named data-amp-report-test, this string // will be set and contain the value found for that attribute. This is used // in tests to match specific errors to specific tags in the test cases. It // is not a rendered value. DataAmpReportTestValue *string `protobuf:"bytes,9,opt,name=data_amp_report_test_value,json=dataAmpReportTestValue" json:"data_amp_report_test_value,omitempty"` } // Default values for ValidationError fields. const ( Default_ValidationError_Severity = ValidationError_ERROR Default_ValidationError_Line = int32(1) ) func (x *ValidationError) Reset() { *x = ValidationError{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ValidationError) String() string { return protoimpl.X.MessageStringOf(x) } func (*ValidationError) ProtoMessage() {} func (x *ValidationError) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ValidationError.ProtoReflect.Descriptor instead. func (*ValidationError) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{26} } func (x *ValidationError) GetSeverity() ValidationError_Severity { if x != nil && x.Severity != nil { return *x.Severity } return Default_ValidationError_Severity } func (x *ValidationError) GetCode() ValidationError_Code { if x != nil && x.Code != nil { return *x.Code } return ValidationError_UNKNOWN_CODE } func (x *ValidationError) GetLine() int32 { if x != nil && x.Line != nil { return *x.Line } return Default_ValidationError_Line } func (x *ValidationError) GetCol() int32 { if x != nil && x.Col != nil { return *x.Col } return 0 } func (x *ValidationError) GetSpecUrl() string { if x != nil && x.SpecUrl != nil { return *x.SpecUrl } return "" } func (x *ValidationError) GetParams() []string { if x != nil { return x.Params } return nil } func (x *ValidationError) GetCategory() ErrorCategory_Code { if x != nil && x.Category != nil { return *x.Category } return ErrorCategory_UNKNOWN } func (x *ValidationError) GetDataAmpReportTestValue() string { if x != nil && x.DataAmpReportTestValue != nil { return *x.DataAmpReportTestValue } return "" } // Used in the verbose validator to select between multiple generated error // types for a failing error. A higher number means that the error is more // specific, ie: more helpful, preferred. // NEXT AVAILABLE TAG: 3 type ErrorSpecificity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Code *ValidationError_Code `protobuf:"varint,1,opt,name=code,enum=amp.validator.ValidationError_Code" json:"code,omitempty"` Specificity *int32 `protobuf:"varint,2,opt,name=specificity" json:"specificity,omitempty"` } func (x *ErrorSpecificity) Reset() { *x = ErrorSpecificity{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ErrorSpecificity) String() string { return protoimpl.X.MessageStringOf(x) } func (*ErrorSpecificity) ProtoMessage() {} func (x *ErrorSpecificity) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ErrorSpecificity.ProtoReflect.Descriptor instead. func (*ErrorSpecificity) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{27} } func (x *ErrorSpecificity) GetCode() ValidationError_Code { if x != nil && x.Code != nil { return *x.Code } return ValidationError_UNKNOWN_CODE } func (x *ErrorSpecificity) GetSpecificity() int32 { if x != nil && x.Specificity != nil { return *x.Specificity } return 0 } // NEXT AVAILABLE TAG: 3 type ErrorFormat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Code *ValidationError_Code `protobuf:"varint,1,opt,name=code,enum=amp.validator.ValidationError_Code" json:"code,omitempty"` Format *string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"` } func (x *ErrorFormat) Reset() { *x = ErrorFormat{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ErrorFormat) String() string { return protoimpl.X.MessageStringOf(x) } func (*ErrorFormat) ProtoMessage() {} func (x *ErrorFormat) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ErrorFormat.ProtoReflect.Descriptor instead. func (*ErrorFormat) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{28} } func (x *ErrorFormat) GetCode() ValidationError_Code { if x != nil && x.Code != nil { return *x.Code } return ValidationError_UNKNOWN_CODE } func (x *ErrorFormat) GetFormat() string { if x != nil && x.Format != nil { return *x.Format } return "" } // A value to be added to a particular ValueSet, as found when scanning the // document (i.e. AttrSpec.add_value_to_set). // NEXT AVAILABLE TAG: 3 type ValueSetProvision struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The collection to add the attribute value to. Set *AttrSpec_ValueSet `protobuf:"varint,1,opt,name=set,enum=amp.validator.AttrSpec_ValueSet" json:"set,omitempty"` // The value of the attribute itself. Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` } func (x *ValueSetProvision) Reset() { *x = ValueSetProvision{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ValueSetProvision) String() string { return protoimpl.X.MessageStringOf(x) } func (*ValueSetProvision) ProtoMessage() {} func (x *ValueSetProvision) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ValueSetProvision.ProtoReflect.Descriptor instead. func (*ValueSetProvision) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{29} } func (x *ValueSetProvision) GetSet() AttrSpec_ValueSet { if x != nil && x.Set != nil { return *x.Set } return AttrSpec_UNKNOWN_VALUESET } func (x *ValueSetProvision) GetValue() string { if x != nil && x.Value != nil { return *x.Value } return "" } // A requirement that a particular value appears in a particular ValueSet (i.e. // AttrSpec.value_oneof_set). All the provisions and requirements are collected // until the document has been fully scanned, and then compared to ensure that // all requirements are met. This allows provisions to appear after (or even // alongside) requirements. // NEXT AVAILABLE TAG: 3 type ValueSetRequirement struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The provision that is required. Provision *ValueSetProvision `protobuf:"bytes,1,opt,name=provision" json:"provision,omitempty"` // The error that will appear if the requirement is not met. This includes the // line/col of the attribute that makes the requirement. ErrorIfUnsatisfied *ValidationError `protobuf:"bytes,2,opt,name=error_if_unsatisfied,json=errorIfUnsatisfied" json:"error_if_unsatisfied,omitempty"` } func (x *ValueSetRequirement) Reset() { *x = ValueSetRequirement{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ValueSetRequirement) String() string { return protoimpl.X.MessageStringOf(x) } func (*ValueSetRequirement) ProtoMessage() {} func (x *ValueSetRequirement) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ValueSetRequirement.ProtoReflect.Descriptor instead. func (*ValueSetRequirement) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{30} } func (x *ValueSetRequirement) GetProvision() *ValueSetProvision { if x != nil { return x.Provision } return nil } func (x *ValueSetRequirement) GetErrorIfUnsatisfied() *ValidationError { if x != nil { return x.ErrorIfUnsatisfied } return nil } // The validation result provided by Validator instances (see Validator::Result // in validator.h). To render such a proto see RenderValidationResult. // NEXT AVAILABLE TAG: 9 type ValidationResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Status *ValidationResult_Status `protobuf:"varint,2,opt,name=status,enum=amp.validator.ValidationResult_Status" json:"status,omitempty"` Errors []*ValidationError `protobuf:"bytes,1,rep,name=errors" json:"errors,omitempty"` // The following field is deprecated and can return any value. Do not depend // on this. // // Deprecated: Do not use. ValidatorRevision *int32 `protobuf:"varint,3,opt,name=validator_revision,json=validatorRevision,def=-1" json:"validator_revision,omitempty"` // Deprecated: Do not use. SpecFileRevision *int32 `protobuf:"varint,4,opt,name=spec_file_revision,json=specFileRevision,def=-1" json:"spec_file_revision,omitempty"` // If the AMP document is a transformed AMP document, then this is the // version of the transformers that were used to transform it. If the document // is not transformed, then the transformer_version's value will be 0. // Note: the AMP Pacakager's transformer library specifies the version as // int64. However, JavaScript does not natively support int64 so int32 is // used instead. // https://github.com/ampproject/amppackager/blob/master/transformer/transformers/context.go TransformerVersion *int32 `protobuf:"varint,6,opt,name=transformer_version,json=transformerVersion,def=0" json:"transformer_version,omitempty"` // The type idenfitier of the parsed document, e.g. AMP, AMP4ADS or some other // type that has yet to be defined. These are declared on the HTML tag and // parsed by the Validator Engine. TypeIdentifier []string `protobuf:"bytes,5,rep,name=type_identifier,json=typeIdentifier" json:"type_identifier,omitempty"` // The set of provisions from all matching AttrSpecs in this TagSpec match. // If the TagSpec is selected, these will be added to the final set of // provisions. ValueSetProvisions []*ValueSetProvision `protobuf:"bytes,7,rep,name=value_set_provisions,json=valueSetProvisions" json:"value_set_provisions,omitempty"` // The set of requirements from all matching AttrSpecs in this TagSpec match. // If the TagSpec is selected, these will be added to the final set of // requirements. ValueSetRequirements []*ValueSetRequirement `protobuf:"bytes,8,rep,name=value_set_requirements,json=valueSetRequirements" json:"value_set_requirements,omitempty"` } // Default values for ValidationResult fields. const ( Default_ValidationResult_ValidatorRevision = int32(-1) Default_ValidationResult_SpecFileRevision = int32(-1) Default_ValidationResult_TransformerVersion = int32(0) ) func (x *ValidationResult) Reset() { *x = ValidationResult{} if protoimpl.UnsafeEnabled { mi := &file_validator_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ValidationResult) String() string { return protoimpl.X.MessageStringOf(x) } func (*ValidationResult) ProtoMessage() {} func (x *ValidationResult) ProtoReflect() protoreflect.Message { mi := &file_validator_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ValidationResult.ProtoReflect.Descriptor instead. func (*ValidationResult) Descriptor() ([]byte, []int) { return file_validator_proto_rawDescGZIP(), []int{31} } func (x *ValidationResult) GetStatus() ValidationResult_Status { if x != nil && x.Status != nil { return *x.Status } return ValidationResult_UNKNOWN } func (x *ValidationResult) GetErrors() []*ValidationError { if x != nil { return x.Errors } return nil } // Deprecated: Do not use. func (x *ValidationResult) GetValidatorRevision() int32 { if x != nil && x.ValidatorRevision != nil { return *x.ValidatorRevision } return Default_ValidationResult_ValidatorRevision } // Deprecated: Do not use. func (x *ValidationResult) GetSpecFileRevision() int32 { if x != nil && x.SpecFileRevision != nil { return *x.SpecFileRevision } return Default_ValidationResult_SpecFileRevision } func (x *ValidationResult) GetTransformerVersion() int32 { if x != nil && x.TransformerVersion != nil { return *x.TransformerVersion } return Default_ValidationResult_TransformerVersion } func (x *ValidationResult) GetTypeIdentifier() []string { if x != nil { return x.TypeIdentifier } return nil } func (x *ValidationResult) GetValueSetProvisions() []*ValueSetProvision { if x != nil { return x.ValueSetProvisions } return nil } func (x *ValidationResult) GetValueSetRequirements() []*ValueSetRequirement { if x != nil { return x.ValueSetRequirements } return nil } var File_validator_proto protoreflect.FileDescriptor var file_validator_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x65, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x66, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x66, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x6c, 0x73, 0x6f, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x6c, 0x73, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x74, 0x72, 0x22, 0x79, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x53, 0x70, 0x65, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x7a, 0x0a, 0x07, 0x55, 0x72, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x2b, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x71, 0x0a, 0x0e, 0x43, 0x73, 0x73, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x69, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x61, 0x73, 0x65, 0x69, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x67, 0x65, 0x78, 0x43, 0x61, 0x73, 0x65, 0x69, 0x22, 0x9a, 0x0b, 0x0a, 0x08, 0x41, 0x74, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x6e, 0x79, 0x6f, 0x66, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6e, 0x79, 0x6f, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x69, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x61, 0x73, 0x65, 0x69, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x67, 0x65, 0x78, 0x43, 0x61, 0x73, 0x65, 0x69, 0x12, 0x33, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x55, 0x72, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x4a, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x53, 0x70, 0x65, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x64, 0x6f, 0x63, 0x5f, 0x63, 0x73, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x6f, 0x63, 0x43, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x64, 0x6f, 0x63, 0x5f, 0x73, 0x76, 0x67, 0x5f, 0x63, 0x73, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x6f, 0x63, 0x53, 0x76, 0x67, 0x43, 0x73, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x61, 0x64, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0d, 0x61, 0x64, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x6f, 0x53, 0x65, 0x74, 0x12, 0x48, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x53, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x46, 0x0a, 0x0f, 0x63, 0x73, 0x73, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x73, 0x73, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x73, 0x73, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x0d, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x22, 0x46, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x44, 0x53, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4d, 0x50, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x49, 0x44, 0x53, 0x10, 0x02, 0x22, 0x70, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x50, 0x41, 0x54, 0x43, 0x48, 0x10, 0x03, 0x22, 0x4d, 0x0a, 0x08, 0x41, 0x74, 0x74, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x22, 0x39, 0x0a, 0x11, 0x44, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x66, 0x0a, 0x0f, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x73, 0x73, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x14, 0x44, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x65, 0x67, 0x65, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x6d, 0x0a, 0x0e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x0f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x5f, 0x61, 0x73, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0d, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x41, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x7f, 0x0a, 0x0c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x5f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x69, 0x0a, 0x0a, 0x41, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x10, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0e, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb4, 0x02, 0x0a, 0x07, 0x43, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3b, 0x0a, 0x0c, 0x61, 0x74, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x61, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6d, 0x70, 0x34, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x41, 0x6d, 0x70, 0x34, 0x61, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x22, 0xfe, 0x02, 0x0a, 0x09, 0x43, 0x64, 0x61, 0x74, 0x61, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x32, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x31, 0x0a, 0x08, 0x63, 0x73, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x63, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x77, 0x68, 0x69, 0x74, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x59, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x67, 0x65, 0x78, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x22, 0x0a, 0x0d, 0x64, 0x6f, 0x63, 0x5f, 0x63, 0x73, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x43, 0x73, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xd9, 0x02, 0x0a, 0x09, 0x41, 0x6d, 0x70, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x11, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x6d, 0x70, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x2e, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x10, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x06, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x05, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x49, 0x4c, 0x4c, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x49, 0x58, 0x45, 0x44, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x49, 0x58, 0x45, 0x44, 0x5f, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4c, 0x45, 0x58, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x4c, 0x55, 0x49, 0x44, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x54, 0x52, 0x49, 0x4e, 0x53, 0x49, 0x43, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x44, 0x49, 0x53, 0x50, 0x4c, 0x41, 0x59, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x49, 0x56, 0x45, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x22, 0x75, 0x0a, 0x0e, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0x25, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x52, 0x4f, 0x4c, 0x4c, 0x10, 0x01, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3b, 0x0a, 0x18, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x31, 0x52, 0x15, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x75, 0x6d, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x1a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x66, 0x69, 0x72, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x42, 0x0a, 0x1c, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x31, 0x52, 0x18, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x67, 0x73, 0x22, 0x6a, 0x0a, 0x0e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x61, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0xf0, 0x04, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x62, 0x65, 0x6e, 0x74, 0x6f, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x62, 0x65, 0x6e, 0x74, 0x6f, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x61, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x0e, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x1b, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x19, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x48, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x22, 0x3e, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x45, 0x4d, 0x50, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x22, 0x5d, 0x0a, 0x0a, 0x48, 0x74, 0x6d, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x4f, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4d, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4d, 0x50, 0x34, 0x41, 0x44, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x4d, 0x50, 0x34, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x10, 0x04, 0x22, 0xbb, 0x0d, 0x0a, 0x07, 0x54, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3f, 0x0a, 0x0b, 0x68, 0x74, 0x6d, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x48, 0x74, 0x6d, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x68, 0x74, 0x6d, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x24, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x49, 0x64, 0x3a, 0x07, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x52, 0x07, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x35, 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x28, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x25, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x61, 0x6c, 0x73, 0x6f, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x61, 0x6c, 0x73, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x54, 0x61, 0x67, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x18, 0x20, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x35, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x41, 0x74, 0x74, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x63, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x64, 0x61, 0x74, 0x61, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x13, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x14, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x12, 0x48, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x37, 0x0a, 0x0a, 0x61, 0x6d, 0x70, 0x5f, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x6d, 0x70, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x52, 0x09, 0x61, 0x6d, 0x70, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x48, 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x22, 0x46, 0x0a, 0x07, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x49, 0x64, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x46, 0x4f, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x53, 0x48, 0x45, 0x45, 0x54, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x41, 0x4d, 0x50, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x02, 0x22, 0xd8, 0x01, 0x0a, 0x07, 0x44, 0x6f, 0x63, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3f, 0x0a, 0x0b, 0x68, 0x74, 0x6d, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x48, 0x74, 0x6d, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x68, 0x74, 0x6d, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1f, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x32, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x22, 0xb3, 0x07, 0x0a, 0x0a, 0x44, 0x6f, 0x63, 0x43, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3f, 0x0a, 0x0b, 0x68, 0x74, 0x6d, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x48, 0x74, 0x6d, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x68, 0x74, 0x6d, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x36, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x69, 0x73, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x49, 0x73, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x32, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x31, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x12, 0x75, 0x72, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x10, 0x75, 0x72, 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x49, 0x0a, 0x1e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x73, 0x73, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x76, 0x67, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x73, 0x73, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x76, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x76, 0x67, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x76, 0x67, 0x12, 0x3c, 0x0a, 0x0e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x55, 0x72, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3a, 0x0a, 0x0d, 0x66, 0x6f, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x55, 0x72, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x66, 0x6f, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2e, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x22, 0xf4, 0x05, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x1f, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x1c, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x12, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x31, 0x42, 0x02, 0x18, 0x01, 0x52, 0x10, 0x73, 0x70, 0x65, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x53, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x3f, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x11, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x69, 0x74, 0x79, 0x52, 0x10, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x13, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x11, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x54, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x64, 0x6f, 0x63, 0x12, 0x2b, 0x0a, 0x03, 0x63, 0x73, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x44, 0x6f, 0x63, 0x43, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x63, 0x73, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x24, 0x0a, 0x0d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x13, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x22, 0xe1, 0x22, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x3a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x01, 0x31, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x63, 0x6f, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x65, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x1a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x6d, 0x70, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6d, 0x70, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x38, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x22, 0xb7, 0x1f, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x54, 0x4d, 0x4c, 0x10, 0x6f, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x41, 0x47, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x18, 0x12, 0x23, 0x0a, 0x1f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x4c, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x47, 0x5f, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x55, 0x53, 0x45, 0x44, 0x10, 0x4f, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x55, 0x53, 0x45, 0x44, 0x10, 0x54, 0x12, 0x28, 0x0a, 0x24, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x50, 0x12, 0x1d, 0x0a, 0x19, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x7a, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x10, 0x7b, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x4f, 0x4e, 0x5f, 0x4c, 0x54, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x41, 0x46, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x54, 0x53, 0x10, 0x70, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x54, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x41, 0x46, 0x54, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x4c, 0x54, 0x53, 0x10, 0x71, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x77, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x4d, 0x50, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x79, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x42, 0x55, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x3d, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x33, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x58, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x10, 0x51, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x5e, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4c, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x10, 0x1b, 0x12, 0x1d, 0x0a, 0x19, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, 0x10, 0x69, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4c, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x16, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x4c, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x1a, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x1c, 0x12, 0x20, 0x0a, 0x1c, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x41, 0x4e, 0x59, 0x4f, 0x46, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x68, 0x12, 0x17, 0x0a, 0x13, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x49, 0x4d, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x3c, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x06, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x49, 0x51, 0x55, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x4d, 0x12, 0x14, 0x0a, 0x10, 0x57, 0x52, 0x4f, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x53, 0x48, 0x45, 0x45, 0x54, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x32, 0x12, 0x28, 0x0a, 0x24, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x53, 0x48, 0x45, 0x45, 0x54, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x66, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x67, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x76, 0x12, 0x28, 0x0a, 0x24, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x56, 0x49, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x53, 0x5f, 0x44, 0x45, 0x4e, 0x59, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x1e, 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x4f, 0x4e, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x45, 0x44, 0x10, 0x52, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x43, 0x44, 0x41, 0x54, 0x41, 0x10, 0x6a, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x10, 0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x0c, 0x12, 0x2e, 0x0a, 0x2a, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x0e, 0x12, 0x28, 0x0a, 0x24, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x0f, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x23, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x24, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x52, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x10, 0x25, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x3e, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x31, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x55, 0x54, 0x55, 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x45, 0x58, 0x43, 0x4c, 0x55, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x53, 0x10, 0x11, 0x12, 0x24, 0x0a, 0x20, 0x55, 0x4e, 0x45, 0x53, 0x43, 0x41, 0x50, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x12, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x13, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x14, 0x12, 0x2b, 0x0a, 0x27, 0x49, 0x4e, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x54, 0x53, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x57, 0x49, 0x44, 0x54, 0x48, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x10, 0x15, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x10, 0x17, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x10, 0x59, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x10, 0x1f, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x48, 0x49, 0x4e, 0x54, 0x10, 0x20, 0x12, 0x25, 0x0a, 0x21, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4c, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x10, 0x21, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x4c, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x10, 0x22, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x53, 0x10, 0x38, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4d, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x53, 0x10, 0x55, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x39, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x3a, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x46, 0x41, 0x43, 0x54, 0x55, 0x52, 0x45, 0x44, 0x5f, 0x42, 0x4f, 0x44, 0x59, 0x10, 0x40, 0x12, 0x2e, 0x0a, 0x2a, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x41, 0x54, 0x49, 0x53, 0x46, 0x59, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x42, 0x12, 0x25, 0x0a, 0x21, 0x4d, 0x41, 0x4e, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x43, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x44, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x41, 0x47, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x48, 0x41, 0x56, 0x45, 0x5f, 0x53, 0x49, 0x42, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x10, 0x57, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x41, 0x47, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x4c, 0x49, 0x43, 0x54, 0x10, 0x45, 0x12, 0x37, 0x0a, 0x33, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x41, 0x54, 0x49, 0x53, 0x46, 0x59, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x46, 0x12, 0x22, 0x0a, 0x1e, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x54, 0x41, 0x47, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x43, 0x45, 0x45, 0x44, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x55, 0x52, 0x4c, 0x53, 0x10, 0x4e, 0x12, 0x1e, 0x0a, 0x1a, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x53, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x61, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x58, 0x10, 0x56, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x54, 0x46, 0x38, 0x10, 0x60, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x6c, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x56, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x6d, 0x12, 0x25, 0x0a, 0x21, 0x41, 0x4d, 0x50, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x5f, 0x43, 0x53, 0x53, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x10, 0x78, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x6e, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x54, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x1d, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x59, 0x5f, 0x54, 0x52, 0x41, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x10, 0x26, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x27, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x28, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x42, 0x41, 0x44, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x29, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x45, 0x4f, 0x46, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x45, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x4f, 0x46, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x2a, 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x2b, 0x12, 0x25, 0x0a, 0x21, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x2c, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x53, 0x45, 0x55, 0x44, 0x4f, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x2d, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x2e, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x2f, 0x12, 0x31, 0x0a, 0x2d, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x55, 0x4e, 0x50, 0x41, 0x52, 0x53, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x5f, 0x52, 0x45, 0x4d, 0x41, 0x49, 0x4e, 0x53, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x30, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x34, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x35, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x55, 0x52, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x10, 0x36, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x3f, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x37, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x3b, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x10, 0x5a, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x4e, 0x4f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x5f, 0x12, 0x31, 0x0a, 0x2d, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x5b, 0x12, 0x40, 0x0a, 0x3c, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x10, 0x5c, 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x46, 0x52, 0x41, 0x4d, 0x45, 0x10, 0x5d, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x4d, 0x41, 0x4c, 0x46, 0x4f, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x62, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x63, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x10, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x72, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x50, 0x53, 0x45, 0x55, 0x44, 0x4f, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x73, 0x12, 0x28, 0x0a, 0x24, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x50, 0x53, 0x45, 0x55, 0x44, 0x4f, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x74, 0x12, 0x28, 0x0a, 0x24, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x47, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x10, 0x75, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x53, 0x53, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x53, 0x53, 0x49, 0x56, 0x45, 0x4c, 0x59, 0x5f, 0x4e, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x6b, 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x48, 0x49, 0x4e, 0x54, 0x10, 0x48, 0x12, 0x31, 0x0a, 0x2d, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x49, 0x4e, 0x5f, 0x41, 0x54, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x49, 0x12, 0x30, 0x0a, 0x2c, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x54, 0x4f, 0x47, 0x45, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x10, 0x4a, 0x12, 0x2e, 0x0a, 0x2a, 0x43, 0x53, 0x53, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x53, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x4b, 0x22, 0x6d, 0x0a, 0x10, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x69, 0x74, 0x79, 0x22, 0x5e, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x5d, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x03, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x52, 0x03, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x14, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x69, 0x66, 0x5f, 0x75, 0x6e, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x12, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x66, 0x55, 0x6e, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x64, 0x22, 0xad, 0x04, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x31, 0x42, 0x02, 0x18, 0x01, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x12, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x31, 0x42, 0x02, 0x18, 0x01, 0x52, 0x10, 0x73, 0x70, 0x65, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x01, 0x30, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x41, 0x53, 0x53, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x42, 0x21, 0x5a, 0x1f, 0x2e, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x61, 0x6d, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, } var ( file_validator_proto_rawDescOnce sync.Once file_validator_proto_rawDescData = file_validator_proto_rawDesc ) func file_validator_proto_rawDescGZIP() []byte { file_validator_proto_rawDescOnce.Do(func() { file_validator_proto_rawDescData = protoimpl.X.CompressGZIP(file_validator_proto_rawDescData) }) return file_validator_proto_rawDescData } var file_validator_proto_enumTypes = make([]protoimpl.EnumInfo, 12) var file_validator_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_validator_proto_goTypes = []interface{}{ (AttrSpec_ValueSet)(0), // 0: amp.validator.AttrSpec.ValueSet (AttrSpec_DispatchKeyType)(0), // 1: amp.validator.AttrSpec.DispatchKeyType (AmpLayout_Layout)(0), // 2: amp.validator.AmpLayout.Layout (AncestorMarker_Marker)(0), // 3: amp.validator.AncestorMarker.Marker (ExtensionSpec_ExtensionType)(0), // 4: amp.validator.ExtensionSpec.ExtensionType (ExtensionSpec_ExtensionUsageRequirement)(0), // 5: amp.validator.ExtensionSpec.ExtensionUsageRequirement (HtmlFormat_Code)(0), // 6: amp.validator.HtmlFormat.Code (TagSpec_NamedId)(0), // 7: amp.validator.TagSpec.NamedId (ErrorCategory_Code)(0), // 8: amp.validator.ErrorCategory.Code (ValidationError_Severity)(0), // 9: amp.validator.ValidationError.Severity (ValidationError_Code)(0), // 10: amp.validator.ValidationError.Code (ValidationResult_Status)(0), // 11: amp.validator.ValidationResult.Status (*AttrTriggerSpec)(nil), // 12: amp.validator.AttrTriggerSpec (*PropertySpec)(nil), // 13: amp.validator.PropertySpec (*PropertySpecList)(nil), // 14: amp.validator.PropertySpecList (*UrlSpec)(nil), // 15: amp.validator.UrlSpec (*CssDeclaration)(nil), // 16: amp.validator.CssDeclaration (*AttrSpec)(nil), // 17: amp.validator.AttrSpec (*AttrList)(nil), // 18: amp.validator.AttrList (*DescendantTagList)(nil), // 19: amp.validator.DescendantTagList (*DeclarationList)(nil), // 20: amp.validator.DeclarationList (*DisallowedCDataRegex)(nil), // 21: amp.validator.DisallowedCDataRegex (*MediaQuerySpec)(nil), // 22: amp.validator.MediaQuerySpec (*SelectorSpec)(nil), // 23: amp.validator.SelectorSpec (*AtRuleSpec)(nil), // 24: amp.validator.AtRuleSpec (*CssSpec)(nil), // 25: amp.validator.CssSpec (*CdataSpec)(nil), // 26: amp.validator.CdataSpec (*AmpLayout)(nil), // 27: amp.validator.AmpLayout (*AncestorMarker)(nil), // 28: amp.validator.AncestorMarker (*ChildTagSpec)(nil), // 29: amp.validator.ChildTagSpec (*ReferencePoint)(nil), // 30: amp.validator.ReferencePoint (*ExtensionSpec)(nil), // 31: amp.validator.ExtensionSpec (*HtmlFormat)(nil), // 32: amp.validator.HtmlFormat (*TagSpec)(nil), // 33: amp.validator.TagSpec (*DocSpec)(nil), // 34: amp.validator.DocSpec (*DocCssSpec)(nil), // 35: amp.validator.DocCssSpec (*ValidatorRules)(nil), // 36: amp.validator.ValidatorRules (*ErrorCategory)(nil), // 37: amp.validator.ErrorCategory (*ValidationError)(nil), // 38: amp.validator.ValidationError (*ErrorSpecificity)(nil), // 39: amp.validator.ErrorSpecificity (*ErrorFormat)(nil), // 40: amp.validator.ErrorFormat (*ValueSetProvision)(nil), // 41: amp.validator.ValueSetProvision (*ValueSetRequirement)(nil), // 42: amp.validator.ValueSetRequirement (*ValidationResult)(nil), // 43: amp.validator.ValidationResult } var file_validator_proto_depIdxs = []int32{ 13, // 0: amp.validator.PropertySpecList.properties:type_name -> amp.validator.PropertySpec 15, // 1: amp.validator.AttrSpec.value_url:type_name -> amp.validator.UrlSpec 14, // 2: amp.validator.AttrSpec.value_properties:type_name -> amp.validator.PropertySpecList 0, // 3: amp.validator.AttrSpec.add_value_to_set:type_name -> amp.validator.AttrSpec.ValueSet 0, // 4: amp.validator.AttrSpec.value_oneof_set:type_name -> amp.validator.AttrSpec.ValueSet 12, // 5: amp.validator.AttrSpec.trigger:type_name -> amp.validator.AttrTriggerSpec 16, // 6: amp.validator.AttrSpec.css_declaration:type_name -> amp.validator.CssDeclaration 1, // 7: amp.validator.AttrSpec.dispatch_key:type_name -> amp.validator.AttrSpec.DispatchKeyType 28, // 8: amp.validator.AttrSpec.requires_ancestor:type_name -> amp.validator.AncestorMarker 17, // 9: amp.validator.AttrList.attrs:type_name -> amp.validator.AttrSpec 16, // 10: amp.validator.DeclarationList.declaration:type_name -> amp.validator.CssDeclaration 22, // 11: amp.validator.AtRuleSpec.media_query_spec:type_name -> amp.validator.MediaQuerySpec 24, // 12: amp.validator.CssSpec.at_rule_spec:type_name -> amp.validator.AtRuleSpec 23, // 13: amp.validator.CssSpec.selector_spec:type_name -> amp.validator.SelectorSpec 25, // 14: amp.validator.CdataSpec.css_spec:type_name -> amp.validator.CssSpec 21, // 15: amp.validator.CdataSpec.disallowed_cdata_regex:type_name -> amp.validator.DisallowedCDataRegex 2, // 16: amp.validator.AmpLayout.supported_layouts:type_name -> amp.validator.AmpLayout.Layout 3, // 17: amp.validator.AncestorMarker.marker:type_name -> amp.validator.AncestorMarker.Marker 4, // 18: amp.validator.ExtensionSpec.extension_type:type_name -> amp.validator.ExtensionSpec.ExtensionType 5, // 19: amp.validator.ExtensionSpec.requires_usage:type_name -> amp.validator.ExtensionSpec.ExtensionUsageRequirement 6, // 20: amp.validator.TagSpec.html_format:type_name -> amp.validator.HtmlFormat.Code 7, // 21: amp.validator.TagSpec.named_id:type_name -> amp.validator.TagSpec.NamedId 31, // 22: amp.validator.TagSpec.extension_spec:type_name -> amp.validator.ExtensionSpec 17, // 23: amp.validator.TagSpec.attrs:type_name -> amp.validator.AttrSpec 26, // 24: amp.validator.TagSpec.cdata:type_name -> amp.validator.CdataSpec 29, // 25: amp.validator.TagSpec.child_tags:type_name -> amp.validator.ChildTagSpec 30, // 26: amp.validator.TagSpec.reference_points:type_name -> amp.validator.ReferencePoint 27, // 27: amp.validator.TagSpec.amp_layout:type_name -> amp.validator.AmpLayout 28, // 28: amp.validator.TagSpec.mark_descendants:type_name -> amp.validator.AncestorMarker 6, // 29: amp.validator.DocSpec.html_format:type_name -> amp.validator.HtmlFormat.Code 6, // 30: amp.validator.DocCssSpec.html_format:type_name -> amp.validator.HtmlFormat.Code 16, // 31: amp.validator.DocCssSpec.declaration:type_name -> amp.validator.CssDeclaration 16, // 32: amp.validator.DocCssSpec.declaration_svg:type_name -> amp.validator.CssDeclaration 15, // 33: amp.validator.DocCssSpec.image_url_spec:type_name -> amp.validator.UrlSpec 15, // 34: amp.validator.DocCssSpec.font_url_spec:type_name -> amp.validator.UrlSpec 33, // 35: amp.validator.ValidatorRules.tags:type_name -> amp.validator.TagSpec 18, // 36: amp.validator.ValidatorRules.attr_lists:type_name -> amp.validator.AttrList 40, // 37: amp.validator.ValidatorRules.error_formats:type_name -> amp.validator.ErrorFormat 39, // 38: amp.validator.ValidatorRules.error_specificity:type_name -> amp.validator.ErrorSpecificity 19, // 39: amp.validator.ValidatorRules.descendant_tag_list:type_name -> amp.validator.DescendantTagList 34, // 40: amp.validator.ValidatorRules.doc:type_name -> amp.validator.DocSpec 35, // 41: amp.validator.ValidatorRules.css:type_name -> amp.validator.DocCssSpec 20, // 42: amp.validator.ValidatorRules.declaration_list:type_name -> amp.validator.DeclarationList 9, // 43: amp.validator.ValidationError.severity:type_name -> amp.validator.ValidationError.Severity 10, // 44: amp.validator.ValidationError.code:type_name -> amp.validator.ValidationError.Code 8, // 45: amp.validator.ValidationError.category:type_name -> amp.validator.ErrorCategory.Code 10, // 46: amp.validator.ErrorSpecificity.code:type_name -> amp.validator.ValidationError.Code 10, // 47: amp.validator.ErrorFormat.code:type_name -> amp.validator.ValidationError.Code 0, // 48: amp.validator.ValueSetProvision.set:type_name -> amp.validator.AttrSpec.ValueSet 41, // 49: amp.validator.ValueSetRequirement.provision:type_name -> amp.validator.ValueSetProvision 38, // 50: amp.validator.ValueSetRequirement.error_if_unsatisfied:type_name -> amp.validator.ValidationError 11, // 51: amp.validator.ValidationResult.status:type_name -> amp.validator.ValidationResult.Status 38, // 52: amp.validator.ValidationResult.errors:type_name -> amp.validator.ValidationError 41, // 53: amp.validator.ValidationResult.value_set_provisions:type_name -> amp.validator.ValueSetProvision 42, // 54: amp.validator.ValidationResult.value_set_requirements:type_name -> amp.validator.ValueSetRequirement 55, // [55:55] is the sub-list for method output_type 55, // [55:55] is the sub-list for method input_type 55, // [55:55] is the sub-list for extension type_name 55, // [55:55] is the sub-list for extension extendee 0, // [0:55] is the sub-list for field type_name } func init() { file_validator_proto_init() } func file_validator_proto_init() { if File_validator_proto != nil { return } if !protoimpl.UnsafeEnabled { file_validator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AttrTriggerSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PropertySpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PropertySpecList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UrlSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CssDeclaration); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AttrSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AttrList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DescendantTagList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeclarationList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DisallowedCDataRegex); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MediaQuerySpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SelectorSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AtRuleSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CssSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CdataSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AmpLayout); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AncestorMarker); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChildTagSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferencePoint); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExtensionSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HtmlFormat); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TagSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DocCssSpec); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidatorRules); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ErrorCategory); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationError); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ErrorSpecificity); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ErrorFormat); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValueSetProvision); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValueSetRequirement); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_validator_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidationResult); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_validator_proto_rawDesc, NumEnums: 12, NumMessages: 32, NumExtensions: 0, NumServices: 0, }, GoTypes: file_validator_proto_goTypes, DependencyIndexes: file_validator_proto_depIdxs, EnumInfos: file_validator_proto_enumTypes, MessageInfos: file_validator_proto_msgTypes, }.Build() File_validator_proto = out.File file_validator_proto_rawDesc = nil file_validator_proto_goTypes = nil file_validator_proto_depIdxs = nil }