// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/protobuf/descriptor.proto

package descriptor_proto

import (
	protoapi "github.com/golang/protobuf/protoapi"
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	prototype "github.com/golang/protobuf/v2/reflect/prototype"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
)

type FieldDescriptorProto_Type int32

const (
	// 0 is reserved for errors.
	// Order is weird for historical reasons.
	FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1
	FieldDescriptorProto_TYPE_FLOAT  FieldDescriptorProto_Type = 2
	// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
	// negative values are likely.
	FieldDescriptorProto_TYPE_INT64  FieldDescriptorProto_Type = 3
	FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4
	// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
	// negative values are likely.
	FieldDescriptorProto_TYPE_INT32   FieldDescriptorProto_Type = 5
	FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6
	FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7
	FieldDescriptorProto_TYPE_BOOL    FieldDescriptorProto_Type = 8
	FieldDescriptorProto_TYPE_STRING  FieldDescriptorProto_Type = 9
	// Tag-delimited aggregate.
	// Group type is deprecated and not supported in proto3. However, Proto3
	// implementations should still be able to parse the group wire format and
	// treat group fields as unknown fields.
	FieldDescriptorProto_TYPE_GROUP   FieldDescriptorProto_Type = 10
	FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11
	// New in version 2.
	FieldDescriptorProto_TYPE_BYTES    FieldDescriptorProto_Type = 12
	FieldDescriptorProto_TYPE_UINT32   FieldDescriptorProto_Type = 13
	FieldDescriptorProto_TYPE_ENUM     FieldDescriptorProto_Type = 14
	FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15
	FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16
	FieldDescriptorProto_TYPE_SINT32   FieldDescriptorProto_Type = 17
	FieldDescriptorProto_TYPE_SINT64   FieldDescriptorProto_Type = 18
)

type xxx_FieldDescriptorProto_Type FieldDescriptorProto_Type

func (e FieldDescriptorProto_Type) ProtoReflect() protoreflect.Enum {
	return (xxx_FieldDescriptorProto_Type)(e)
}
func (e xxx_FieldDescriptorProto_Type) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[0]
}
func (e xxx_FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldDescriptorProto_Type_name = map[int32]string{
	1:  "TYPE_DOUBLE",
	2:  "TYPE_FLOAT",
	3:  "TYPE_INT64",
	4:  "TYPE_UINT64",
	5:  "TYPE_INT32",
	6:  "TYPE_FIXED64",
	7:  "TYPE_FIXED32",
	8:  "TYPE_BOOL",
	9:  "TYPE_STRING",
	10: "TYPE_GROUP",
	11: "TYPE_MESSAGE",
	12: "TYPE_BYTES",
	13: "TYPE_UINT32",
	14: "TYPE_ENUM",
	15: "TYPE_SFIXED32",
	16: "TYPE_SFIXED64",
	17: "TYPE_SINT32",
	18: "TYPE_SINT64",
}

var FieldDescriptorProto_Type_value = map[string]int32{
	"TYPE_DOUBLE":   1,
	"TYPE_FLOAT":    2,
	"TYPE_INT64":    3,
	"TYPE_UINT64":   4,
	"TYPE_INT32":    5,
	"TYPE_FIXED64":  6,
	"TYPE_FIXED32":  7,
	"TYPE_BOOL":     8,
	"TYPE_STRING":   9,
	"TYPE_GROUP":    10,
	"TYPE_MESSAGE":  11,
	"TYPE_BYTES":    12,
	"TYPE_UINT32":   13,
	"TYPE_ENUM":     14,
	"TYPE_SFIXED32": 15,
	"TYPE_SFIXED64": 16,
	"TYPE_SINT32":   17,
	"TYPE_SINT64":   18,
}

func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type {
	p := new(FieldDescriptorProto_Type)
	*p = x
	return p
}

func (x FieldDescriptorProto_Type) String() string {
	return protoapi.EnumName(FieldDescriptorProto_Type_name, int32(x))
}

func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type")
	if err != nil {
		return err
	}
	*x = FieldDescriptorProto_Type(value)
	return nil
}

func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{4, 0}
}

type FieldDescriptorProto_Label int32

const (
	// 0 is reserved for errors
	FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1
	FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2
	FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3
)

type xxx_FieldDescriptorProto_Label FieldDescriptorProto_Label

func (e FieldDescriptorProto_Label) ProtoReflect() protoreflect.Enum {
	return (xxx_FieldDescriptorProto_Label)(e)
}
func (e xxx_FieldDescriptorProto_Label) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[1]
}
func (e xxx_FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldDescriptorProto_Label_name = map[int32]string{
	1: "LABEL_OPTIONAL",
	2: "LABEL_REQUIRED",
	3: "LABEL_REPEATED",
}

var FieldDescriptorProto_Label_value = map[string]int32{
	"LABEL_OPTIONAL": 1,
	"LABEL_REQUIRED": 2,
	"LABEL_REPEATED": 3,
}

func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label {
	p := new(FieldDescriptorProto_Label)
	*p = x
	return p
}

func (x FieldDescriptorProto_Label) String() string {
	return protoapi.EnumName(FieldDescriptorProto_Label_name, int32(x))
}

func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label")
	if err != nil {
		return err
	}
	*x = FieldDescriptorProto_Label(value)
	return nil
}

func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{4, 1}
}

// Generated classes can be optimized for speed or code size.
type FileOptions_OptimizeMode int32

const (
	FileOptions_SPEED FileOptions_OptimizeMode = 1
	// etc.
	FileOptions_CODE_SIZE    FileOptions_OptimizeMode = 2
	FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3
)

type xxx_FileOptions_OptimizeMode FileOptions_OptimizeMode

func (e FileOptions_OptimizeMode) ProtoReflect() protoreflect.Enum {
	return (xxx_FileOptions_OptimizeMode)(e)
}
func (e xxx_FileOptions_OptimizeMode) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[2]
}
func (e xxx_FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FileOptions_OptimizeMode_name = map[int32]string{
	1: "SPEED",
	2: "CODE_SIZE",
	3: "LITE_RUNTIME",
}

var FileOptions_OptimizeMode_value = map[string]int32{
	"SPEED":        1,
	"CODE_SIZE":    2,
	"LITE_RUNTIME": 3,
}

func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode {
	p := new(FileOptions_OptimizeMode)
	*p = x
	return p
}

func (x FileOptions_OptimizeMode) String() string {
	return protoapi.EnumName(FileOptions_OptimizeMode_name, int32(x))
}

func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode")
	if err != nil {
		return err
	}
	*x = FileOptions_OptimizeMode(value)
	return nil
}

func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{10, 0}
}

type FieldOptions_CType int32

const (
	// Default mode.
	FieldOptions_STRING       FieldOptions_CType = 0
	FieldOptions_CORD         FieldOptions_CType = 1
	FieldOptions_STRING_PIECE FieldOptions_CType = 2
)

type xxx_FieldOptions_CType FieldOptions_CType

func (e FieldOptions_CType) ProtoReflect() protoreflect.Enum {
	return (xxx_FieldOptions_CType)(e)
}
func (e xxx_FieldOptions_CType) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[3]
}
func (e xxx_FieldOptions_CType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldOptions_CType_name = map[int32]string{
	0: "STRING",
	1: "CORD",
	2: "STRING_PIECE",
}

var FieldOptions_CType_value = map[string]int32{
	"STRING":       0,
	"CORD":         1,
	"STRING_PIECE": 2,
}

func (x FieldOptions_CType) Enum() *FieldOptions_CType {
	p := new(FieldOptions_CType)
	*p = x
	return p
}

func (x FieldOptions_CType) String() string {
	return protoapi.EnumName(FieldOptions_CType_name, int32(x))
}

func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType")
	if err != nil {
		return err
	}
	*x = FieldOptions_CType(value)
	return nil
}

func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{12, 0}
}

type FieldOptions_JSType int32

const (
	// Use the default type.
	FieldOptions_JS_NORMAL FieldOptions_JSType = 0
	// Use JavaScript strings.
	FieldOptions_JS_STRING FieldOptions_JSType = 1
	// Use JavaScript numbers.
	FieldOptions_JS_NUMBER FieldOptions_JSType = 2
)

type xxx_FieldOptions_JSType FieldOptions_JSType

func (e FieldOptions_JSType) ProtoReflect() protoreflect.Enum {
	return (xxx_FieldOptions_JSType)(e)
}
func (e xxx_FieldOptions_JSType) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[4]
}
func (e xxx_FieldOptions_JSType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldOptions_JSType_name = map[int32]string{
	0: "JS_NORMAL",
	1: "JS_STRING",
	2: "JS_NUMBER",
}

var FieldOptions_JSType_value = map[string]int32{
	"JS_NORMAL": 0,
	"JS_STRING": 1,
	"JS_NUMBER": 2,
}

func (x FieldOptions_JSType) Enum() *FieldOptions_JSType {
	p := new(FieldOptions_JSType)
	*p = x
	return p
}

func (x FieldOptions_JSType) String() string {
	return protoapi.EnumName(FieldOptions_JSType_name, int32(x))
}

func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType")
	if err != nil {
		return err
	}
	*x = FieldOptions_JSType(value)
	return nil
}

func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{12, 1}
}

// Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
// or neither? HTTP based RPC implementation may choose GET verb for safe
// methods, and PUT verb for idempotent methods instead of the default POST.
type MethodOptions_IdempotencyLevel int32

const (
	MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0
	MethodOptions_NO_SIDE_EFFECTS     MethodOptions_IdempotencyLevel = 1
	MethodOptions_IDEMPOTENT          MethodOptions_IdempotencyLevel = 2
)

type xxx_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel

func (e MethodOptions_IdempotencyLevel) ProtoReflect() protoreflect.Enum {
	return (xxx_MethodOptions_IdempotencyLevel)(e)
}
func (e xxx_MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[5]
}
func (e xxx_MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var MethodOptions_IdempotencyLevel_name = map[int32]string{
	0: "IDEMPOTENCY_UNKNOWN",
	1: "NO_SIDE_EFFECTS",
	2: "IDEMPOTENT",
}

var MethodOptions_IdempotencyLevel_value = map[string]int32{
	"IDEMPOTENCY_UNKNOWN": 0,
	"NO_SIDE_EFFECTS":     1,
	"IDEMPOTENT":          2,
}

func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel {
	p := new(MethodOptions_IdempotencyLevel)
	*p = x
	return p
}

func (x MethodOptions_IdempotencyLevel) String() string {
	return protoapi.EnumName(MethodOptions_IdempotencyLevel_name, int32(x))
}

func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel")
	if err != nil {
		return err
	}
	*x = MethodOptions_IdempotencyLevel(value)
	return nil
}

func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{17, 0}
}

// The protocol compiler can output a FileDescriptorSet containing the .proto
// files it parses.
type FileDescriptorSet struct {
	File                 []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

type xxx_FileDescriptorSet struct{ m *FileDescriptorSet }

func (m *FileDescriptorSet) ProtoReflect() protoreflect.Message {
	return xxx_FileDescriptorSet{m}
}
func (m xxx_FileDescriptorSet) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[0].Type
}
func (m xxx_FileDescriptorSet) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[0].KnownFieldsOf(m.m)
}
func (m xxx_FileDescriptorSet) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[0].UnknownFieldsOf(m.m)
}
func (m xxx_FileDescriptorSet) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_FileDescriptorSet) ProtoMutable() {}

func (m *FileDescriptorSet) Reset()         { *m = FileDescriptorSet{} }
func (m *FileDescriptorSet) String() string { return protoapi.CompactTextString(m) }
func (*FileDescriptorSet) ProtoMessage()    {}
func (*FileDescriptorSet) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{0}
}

func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto {
	if m != nil {
		return m.File
	}
	return nil
}

// Describes a complete .proto file.
type FileDescriptorProto struct {
	Name    *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"`
	// Names of files imported by this file.
	Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"`
	// Indexes of the public imported files in the dependency list above.
	PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"`
	// Indexes of the weak imported files in the dependency list.
	// For Google-internal migration only. Do not use.
	WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"`
	// All top-level definitions in this file.
	MessageType []*DescriptorProto        `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"`
	EnumType    []*EnumDescriptorProto    `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"`
	Service     []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"`
	Extension   []*FieldDescriptorProto   `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"`
	Options     *FileOptions              `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"`
	// This field contains optional information about the original source code.
	// You may safely remove this entire field without harming runtime
	// functionality of the descriptors -- the information is needed only by
	// development tools.
	SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"`
	// The syntax of the proto file.
	// The supported values are "proto2" and "proto3".
	Syntax               *string  `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_FileDescriptorProto struct{ m *FileDescriptorProto }

func (m *FileDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_FileDescriptorProto{m}
}
func (m xxx_FileDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[1].Type
}
func (m xxx_FileDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[1].KnownFieldsOf(m.m)
}
func (m xxx_FileDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[1].UnknownFieldsOf(m.m)
}
func (m xxx_FileDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_FileDescriptorProto) ProtoMutable() {}

func (m *FileDescriptorProto) Reset()         { *m = FileDescriptorProto{} }
func (m *FileDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*FileDescriptorProto) ProtoMessage()    {}
func (*FileDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{1}
}

func (m *FileDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *FileDescriptorProto) GetPackage() string {
	if m != nil && m.Package != nil {
		return *m.Package
	}
	return ""
}

func (m *FileDescriptorProto) GetDependency() []string {
	if m != nil {
		return m.Dependency
	}
	return nil
}

func (m *FileDescriptorProto) GetPublicDependency() []int32 {
	if m != nil {
		return m.PublicDependency
	}
	return nil
}

func (m *FileDescriptorProto) GetWeakDependency() []int32 {
	if m != nil {
		return m.WeakDependency
	}
	return nil
}

func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto {
	if m != nil {
		return m.MessageType
	}
	return nil
}

func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto {
	if m != nil {
		return m.EnumType
	}
	return nil
}

func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto {
	if m != nil {
		return m.Service
	}
	return nil
}

func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto {
	if m != nil {
		return m.Extension
	}
	return nil
}

func (m *FileDescriptorProto) GetOptions() *FileOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo {
	if m != nil {
		return m.SourceCodeInfo
	}
	return nil
}

func (m *FileDescriptorProto) GetSyntax() string {
	if m != nil && m.Syntax != nil {
		return *m.Syntax
	}
	return ""
}

// Describes a message type.
type DescriptorProto struct {
	Name           *string                           `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Field          []*FieldDescriptorProto           `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"`
	Extension      []*FieldDescriptorProto           `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"`
	NestedType     []*DescriptorProto                `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"`
	EnumType       []*EnumDescriptorProto            `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"`
	ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"`
	OneofDecl      []*OneofDescriptorProto           `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"`
	Options        *MessageOptions                   `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"`
	ReservedRange  []*DescriptorProto_ReservedRange  `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"`
	// Reserved field names, which may not be used by fields in the same message.
	// A given name may only be reserved once.
	ReservedName         []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_DescriptorProto struct{ m *DescriptorProto }

func (m *DescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_DescriptorProto{m}
}
func (m xxx_DescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[2].Type
}
func (m xxx_DescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[2].KnownFieldsOf(m.m)
}
func (m xxx_DescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[2].UnknownFieldsOf(m.m)
}
func (m xxx_DescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_DescriptorProto) ProtoMutable() {}

func (m *DescriptorProto) Reset()         { *m = DescriptorProto{} }
func (m *DescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*DescriptorProto) ProtoMessage()    {}
func (*DescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{2}
}

func (m *DescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *DescriptorProto) GetField() []*FieldDescriptorProto {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto {
	if m != nil {
		return m.Extension
	}
	return nil
}

func (m *DescriptorProto) GetNestedType() []*DescriptorProto {
	if m != nil {
		return m.NestedType
	}
	return nil
}

func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto {
	if m != nil {
		return m.EnumType
	}
	return nil
}

func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange {
	if m != nil {
		return m.ExtensionRange
	}
	return nil
}

func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto {
	if m != nil {
		return m.OneofDecl
	}
	return nil
}

func (m *DescriptorProto) GetOptions() *MessageOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange {
	if m != nil {
		return m.ReservedRange
	}
	return nil
}

func (m *DescriptorProto) GetReservedName() []string {
	if m != nil {
		return m.ReservedName
	}
	return nil
}

type DescriptorProto_ExtensionRange struct {
	Start                *int32                 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
	End                  *int32                 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
	Options              *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

type xxx_DescriptorProto_ExtensionRange struct {
	m *DescriptorProto_ExtensionRange
}

func (m *DescriptorProto_ExtensionRange) ProtoReflect() protoreflect.Message {
	return xxx_DescriptorProto_ExtensionRange{m}
}
func (m xxx_DescriptorProto_ExtensionRange) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[21].Type
}
func (m xxx_DescriptorProto_ExtensionRange) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[21].KnownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ExtensionRange) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[21].UnknownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ExtensionRange) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_DescriptorProto_ExtensionRange) ProtoMutable() {}

func (m *DescriptorProto_ExtensionRange) Reset()         { *m = DescriptorProto_ExtensionRange{} }
func (m *DescriptorProto_ExtensionRange) String() string { return protoapi.CompactTextString(m) }
func (*DescriptorProto_ExtensionRange) ProtoMessage()    {}
func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{2, 0}
}

func (m *DescriptorProto_ExtensionRange) GetStart() int32 {
	if m != nil && m.Start != nil {
		return *m.Start
	}
	return 0
}

func (m *DescriptorProto_ExtensionRange) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Range of reserved tag numbers. Reserved tag numbers may not be used by
// fields or extension ranges in the same message. Reserved ranges may
// not overlap.
type DescriptorProto_ReservedRange struct {
	Start                *int32   `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
	End                  *int32   `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_DescriptorProto_ReservedRange struct {
	m *DescriptorProto_ReservedRange
}

func (m *DescriptorProto_ReservedRange) ProtoReflect() protoreflect.Message {
	return xxx_DescriptorProto_ReservedRange{m}
}
func (m xxx_DescriptorProto_ReservedRange) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[22].Type
}
func (m xxx_DescriptorProto_ReservedRange) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[22].KnownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ReservedRange) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[22].UnknownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ReservedRange) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_DescriptorProto_ReservedRange) ProtoMutable() {}

func (m *DescriptorProto_ReservedRange) Reset()         { *m = DescriptorProto_ReservedRange{} }
func (m *DescriptorProto_ReservedRange) String() string { return protoapi.CompactTextString(m) }
func (*DescriptorProto_ReservedRange) ProtoMessage()    {}
func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{2, 1}
}

func (m *DescriptorProto_ReservedRange) GetStart() int32 {
	if m != nil && m.Start != nil {
		return *m.Start
	}
	return 0
}

func (m *DescriptorProto_ReservedRange) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

type ExtensionRangeOptions struct {
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_ExtensionRangeOptions struct{ m *ExtensionRangeOptions }

func (m *ExtensionRangeOptions) ProtoReflect() protoreflect.Message {
	return xxx_ExtensionRangeOptions{m}
}
func (m xxx_ExtensionRangeOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[3].Type
}
func (m xxx_ExtensionRangeOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[3].KnownFieldsOf(m.m)
}
func (m xxx_ExtensionRangeOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[3].UnknownFieldsOf(m.m)
}
func (m xxx_ExtensionRangeOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_ExtensionRangeOptions) ProtoMutable() {}

func (m *ExtensionRangeOptions) Reset()         { *m = ExtensionRangeOptions{} }
func (m *ExtensionRangeOptions) String() string { return protoapi.CompactTextString(m) }
func (*ExtensionRangeOptions) ProtoMessage()    {}
func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{3}
}

var extRange_ExtensionRangeOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*ExtensionRangeOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_ExtensionRangeOptions
}

func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

// Describes a field within a message.
type FieldDescriptorProto struct {
	Name   *string                     `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Number *int32                      `protobuf:"varint,3,opt,name=number" json:"number,omitempty"`
	Label  *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"`
	// If type_name is set, this need not be set.  If both this and type_name
	// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
	Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"`
	// For message and enum types, this is the name of the type.  If the name
	// starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
	// rules are used to find the type (i.e. first the nested types within this
	// message are searched, then within the parent, on up to the root
	// namespace).
	TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"`
	// For extensions, this is the name of the type being extended.  It is
	// resolved in the same manner as type_name.
	Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"`
	// For numeric types, contains the original text representation of the value.
	// For booleans, "true" or "false".
	// For strings, contains the default text contents (not escaped in any way).
	// For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
	// TODO(kenton):  Base-64 encode?
	DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"`
	// If set, gives the index of a oneof in the containing type's oneof_decl
	// list.  This field is a member of that oneof.
	OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"`
	// JSON name of this field. The value is set by protocol compiler. If the
	// user has set a "json_name" option on this field, that option's value
	// will be used. Otherwise, it's deduced from the field's name by converting
	// it to camelCase.
	JsonName             *string       `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"`
	Options              *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

type xxx_FieldDescriptorProto struct{ m *FieldDescriptorProto }

func (m *FieldDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_FieldDescriptorProto{m}
}
func (m xxx_FieldDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[4].Type
}
func (m xxx_FieldDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[4].KnownFieldsOf(m.m)
}
func (m xxx_FieldDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[4].UnknownFieldsOf(m.m)
}
func (m xxx_FieldDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_FieldDescriptorProto) ProtoMutable() {}

func (m *FieldDescriptorProto) Reset()         { *m = FieldDescriptorProto{} }
func (m *FieldDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*FieldDescriptorProto) ProtoMessage()    {}
func (*FieldDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{4}
}

func (m *FieldDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *FieldDescriptorProto) GetNumber() int32 {
	if m != nil && m.Number != nil {
		return *m.Number
	}
	return 0
}

func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label {
	if m != nil && m.Label != nil {
		return *m.Label
	}
	return FieldDescriptorProto_LABEL_OPTIONAL
}

func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type {
	if m != nil && m.Type != nil {
		return *m.Type
	}
	return FieldDescriptorProto_TYPE_DOUBLE
}

func (m *FieldDescriptorProto) GetTypeName() string {
	if m != nil && m.TypeName != nil {
		return *m.TypeName
	}
	return ""
}

func (m *FieldDescriptorProto) GetExtendee() string {
	if m != nil && m.Extendee != nil {
		return *m.Extendee
	}
	return ""
}

func (m *FieldDescriptorProto) GetDefaultValue() string {
	if m != nil && m.DefaultValue != nil {
		return *m.DefaultValue
	}
	return ""
}

func (m *FieldDescriptorProto) GetOneofIndex() int32 {
	if m != nil && m.OneofIndex != nil {
		return *m.OneofIndex
	}
	return 0
}

func (m *FieldDescriptorProto) GetJsonName() string {
	if m != nil && m.JsonName != nil {
		return *m.JsonName
	}
	return ""
}

func (m *FieldDescriptorProto) GetOptions() *FieldOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes a oneof.
type OneofDescriptorProto struct {
	Name                 *string       `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Options              *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

type xxx_OneofDescriptorProto struct{ m *OneofDescriptorProto }

func (m *OneofDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_OneofDescriptorProto{m}
}
func (m xxx_OneofDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[5].Type
}
func (m xxx_OneofDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[5].KnownFieldsOf(m.m)
}
func (m xxx_OneofDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[5].UnknownFieldsOf(m.m)
}
func (m xxx_OneofDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_OneofDescriptorProto) ProtoMutable() {}

func (m *OneofDescriptorProto) Reset()         { *m = OneofDescriptorProto{} }
func (m *OneofDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*OneofDescriptorProto) ProtoMessage()    {}
func (*OneofDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{5}
}

func (m *OneofDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *OneofDescriptorProto) GetOptions() *OneofOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes an enum type.
type EnumDescriptorProto struct {
	Name    *string                     `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Value   []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"`
	Options *EnumOptions                `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	// Range of reserved numeric values. Reserved numeric values may not be used
	// by enum values in the same enum declaration. Reserved ranges may not
	// overlap.
	ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"`
	// Reserved enum value names, which may not be reused. A given name may only
	// be reserved once.
	ReservedName         []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_EnumDescriptorProto struct{ m *EnumDescriptorProto }

func (m *EnumDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_EnumDescriptorProto{m}
}
func (m xxx_EnumDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[6].Type
}
func (m xxx_EnumDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[6].KnownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[6].UnknownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_EnumDescriptorProto) ProtoMutable() {}

func (m *EnumDescriptorProto) Reset()         { *m = EnumDescriptorProto{} }
func (m *EnumDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*EnumDescriptorProto) ProtoMessage()    {}
func (*EnumDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{6}
}

func (m *EnumDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *EnumDescriptorProto) GetOptions() *EnumOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange {
	if m != nil {
		return m.ReservedRange
	}
	return nil
}

func (m *EnumDescriptorProto) GetReservedName() []string {
	if m != nil {
		return m.ReservedName
	}
	return nil
}

// Range of reserved numeric values. Reserved values may not be used by
// entries in the same enum. Reserved ranges may not overlap.
//
// Note that this is distinct from DescriptorProto.ReservedRange in that it
// is inclusive such that it can appropriately represent the entire int32
// domain.
type EnumDescriptorProto_EnumReservedRange struct {
	Start                *int32   `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
	End                  *int32   `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_EnumDescriptorProto_EnumReservedRange struct {
	m *EnumDescriptorProto_EnumReservedRange
}

func (m *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message {
	return xxx_EnumDescriptorProto_EnumReservedRange{m}
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[23].Type
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[23].KnownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[23].UnknownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) ProtoMutable() {}

func (m *EnumDescriptorProto_EnumReservedRange) Reset()         { *m = EnumDescriptorProto_EnumReservedRange{} }
func (m *EnumDescriptorProto_EnumReservedRange) String() string { return protoapi.CompactTextString(m) }
func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage()    {}
func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{6, 0}
}

func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 {
	if m != nil && m.Start != nil {
		return *m.Start
	}
	return 0
}

func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

// Describes a value within an enum.
type EnumValueDescriptorProto struct {
	Name                 *string           `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Number               *int32            `protobuf:"varint,2,opt,name=number" json:"number,omitempty"`
	Options              *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

type xxx_EnumValueDescriptorProto struct{ m *EnumValueDescriptorProto }

func (m *EnumValueDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_EnumValueDescriptorProto{m}
}
func (m xxx_EnumValueDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[7].Type
}
func (m xxx_EnumValueDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[7].KnownFieldsOf(m.m)
}
func (m xxx_EnumValueDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[7].UnknownFieldsOf(m.m)
}
func (m xxx_EnumValueDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_EnumValueDescriptorProto) ProtoMutable() {}

func (m *EnumValueDescriptorProto) Reset()         { *m = EnumValueDescriptorProto{} }
func (m *EnumValueDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*EnumValueDescriptorProto) ProtoMessage()    {}
func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{7}
}

func (m *EnumValueDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *EnumValueDescriptorProto) GetNumber() int32 {
	if m != nil && m.Number != nil {
		return *m.Number
	}
	return 0
}

func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes a service.
type ServiceDescriptorProto struct {
	Name                 *string                  `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Method               []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"`
	Options              *ServiceOptions          `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

type xxx_ServiceDescriptorProto struct{ m *ServiceDescriptorProto }

func (m *ServiceDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_ServiceDescriptorProto{m}
}
func (m xxx_ServiceDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[8].Type
}
func (m xxx_ServiceDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[8].KnownFieldsOf(m.m)
}
func (m xxx_ServiceDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[8].UnknownFieldsOf(m.m)
}
func (m xxx_ServiceDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_ServiceDescriptorProto) ProtoMutable() {}

func (m *ServiceDescriptorProto) Reset()         { *m = ServiceDescriptorProto{} }
func (m *ServiceDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*ServiceDescriptorProto) ProtoMessage()    {}
func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{8}
}

func (m *ServiceDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto {
	if m != nil {
		return m.Method
	}
	return nil
}

func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes a method of a service.
type MethodDescriptorProto struct {
	Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Input and output type names.  These are resolved in the same way as
	// FieldDescriptorProto.type_name, but must refer to a message type.
	InputType  *string        `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"`
	OutputType *string        `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"`
	Options    *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"`
	// Identifies if client streams multiple client messages
	ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"`
	// Identifies if server streams multiple server messages
	ServerStreaming      *bool    `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_MethodDescriptorProto struct{ m *MethodDescriptorProto }

func (m *MethodDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_MethodDescriptorProto{m}
}
func (m xxx_MethodDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[9].Type
}
func (m xxx_MethodDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[9].KnownFieldsOf(m.m)
}
func (m xxx_MethodDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[9].UnknownFieldsOf(m.m)
}
func (m xxx_MethodDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_MethodDescriptorProto) ProtoMutable() {}

func (m *MethodDescriptorProto) Reset()         { *m = MethodDescriptorProto{} }
func (m *MethodDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*MethodDescriptorProto) ProtoMessage()    {}
func (*MethodDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{9}
}

const Default_MethodDescriptorProto_ClientStreaming bool = false
const Default_MethodDescriptorProto_ServerStreaming bool = false

func (m *MethodDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *MethodDescriptorProto) GetInputType() string {
	if m != nil && m.InputType != nil {
		return *m.InputType
	}
	return ""
}

func (m *MethodDescriptorProto) GetOutputType() string {
	if m != nil && m.OutputType != nil {
		return *m.OutputType
	}
	return ""
}

func (m *MethodDescriptorProto) GetOptions() *MethodOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *MethodDescriptorProto) GetClientStreaming() bool {
	if m != nil && m.ClientStreaming != nil {
		return *m.ClientStreaming
	}
	return Default_MethodDescriptorProto_ClientStreaming
}

func (m *MethodDescriptorProto) GetServerStreaming() bool {
	if m != nil && m.ServerStreaming != nil {
		return *m.ServerStreaming
	}
	return Default_MethodDescriptorProto_ServerStreaming
}

type FileOptions struct {
	// Sets the Java package where classes generated from this .proto will be
	// placed.  By default, the proto package is used, but this is often
	// inappropriate because proto packages do not normally start with backwards
	// domain names.
	JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"`
	// If set, all the classes from the .proto file are wrapped in a single
	// outer class with the given name.  This applies to both Proto1
	// (equivalent to the old "--one_java_file" option) and Proto2 (where
	// a .proto always translates to a single class, but you may want to
	// explicitly choose the class name).
	JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"`
	// If set true, then the Java code generator will generate a separate .java
	// file for each top-level message, enum, and service defined in the .proto
	// file.  Thus, these types will *not* be nested inside the outer class
	// named by java_outer_classname.  However, the outer class will still be
	// generated to contain the file's getDescriptor() method as well as any
	// top-level extensions defined in the file.
	JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"`
	// This option does nothing.
	JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use.
	// If set true, then the Java2 code generator will generate code that
	// throws an exception whenever an attempt is made to assign a non-UTF-8
	// byte sequence to a string field.
	// Message reflection will do the same.
	// However, an extension field still accepts non-UTF-8 byte sequences.
	// This option has no effect on when used with the lite runtime.
	JavaStringCheckUtf8 *bool                     `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"`
	OptimizeFor         *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"`
	// Sets the Go package where structs generated from this .proto will be
	// placed. If omitted, the Go package will be derived from the following:
	//   - The basename of the package import path, if provided.
	//   - Otherwise, the package statement in the .proto file, if present.
	//   - Otherwise, the basename of the .proto file, without extension.
	GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"`
	// Should generic services be generated in each language?  "Generic" services
	// are not specific to any particular RPC system.  They are generated by the
	// main code generators in each language (without additional plugins).
	// Generic services were the only kind of service generation supported by
	// early versions of google.protobuf.
	//
	// Generic services are now considered deprecated in favor of using plugins
	// that generate code specific to your particular RPC system.  Therefore,
	// these default to false.  Old code which depends on generic services should
	// explicitly set them to true.
	CcGenericServices   *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"`
	JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"`
	PyGenericServices   *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"`
	PhpGenericServices  *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"`
	// Is this file deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for everything in the file, or it will be completely ignored; in the very
	// least, this is a formalization for deprecating files.
	Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// Enables the use of arenas for the proto messages in this file. This applies
	// only to generated classes for C++.
	CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"`
	// Sets the objective c class prefix which is prepended to all objective c
	// generated classes from this .proto. There is no default.
	ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"`
	// Namespace for generated classes; defaults to the package.
	CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"`
	// By default Swift generators will take the proto package and CamelCase it
	// replacing '.' with underscore and use that to prefix the types/symbols
	// defined. When this options is provided, they will use this value instead
	// to prefix the types/symbols defined.
	SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"`
	// Sets the php class prefix which is prepended to all php generated classes
	// from this .proto. Default is empty.
	PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"`
	// Use this option to change the namespace of php generated classes. Default
	// is empty. When this option is empty, the package name will be used for
	// determining the namespace.
	PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"`
	// Use this option to change the namespace of php generated metadata classes.
	// Default is empty. When this option is empty, the proto file name will be used
	// for determining the namespace.
	PhpMetadataNamespace *string `protobuf:"bytes,44,opt,name=php_metadata_namespace,json=phpMetadataNamespace" json:"php_metadata_namespace,omitempty"`
	// Use this option to change the package of ruby generated classes. Default
	// is empty. When this option is not set, the package name will be used for
	// determining the ruby package.
	RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"`
	// The parser stores options it doesn't recognize here.
	// See the documentation for the "Options" section above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_FileOptions struct{ m *FileOptions }

func (m *FileOptions) ProtoReflect() protoreflect.Message {
	return xxx_FileOptions{m}
}
func (m xxx_FileOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[10].Type
}
func (m xxx_FileOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[10].KnownFieldsOf(m.m)
}
func (m xxx_FileOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[10].UnknownFieldsOf(m.m)
}
func (m xxx_FileOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_FileOptions) ProtoMutable() {}

func (m *FileOptions) Reset()         { *m = FileOptions{} }
func (m *FileOptions) String() string { return protoapi.CompactTextString(m) }
func (*FileOptions) ProtoMessage()    {}
func (*FileOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{10}
}

var extRange_FileOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*FileOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_FileOptions
}

const Default_FileOptions_JavaMultipleFiles bool = false
const Default_FileOptions_JavaStringCheckUtf8 bool = false
const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED
const Default_FileOptions_CcGenericServices bool = false
const Default_FileOptions_JavaGenericServices bool = false
const Default_FileOptions_PyGenericServices bool = false
const Default_FileOptions_PhpGenericServices bool = false
const Default_FileOptions_Deprecated bool = false
const Default_FileOptions_CcEnableArenas bool = false

func (m *FileOptions) GetJavaPackage() string {
	if m != nil && m.JavaPackage != nil {
		return *m.JavaPackage
	}
	return ""
}

func (m *FileOptions) GetJavaOuterClassname() string {
	if m != nil && m.JavaOuterClassname != nil {
		return *m.JavaOuterClassname
	}
	return ""
}

func (m *FileOptions) GetJavaMultipleFiles() bool {
	if m != nil && m.JavaMultipleFiles != nil {
		return *m.JavaMultipleFiles
	}
	return Default_FileOptions_JavaMultipleFiles
}

// Deprecated: Do not use.
func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool {
	if m != nil && m.JavaGenerateEqualsAndHash != nil {
		return *m.JavaGenerateEqualsAndHash
	}
	return false
}

func (m *FileOptions) GetJavaStringCheckUtf8() bool {
	if m != nil && m.JavaStringCheckUtf8 != nil {
		return *m.JavaStringCheckUtf8
	}
	return Default_FileOptions_JavaStringCheckUtf8
}

func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode {
	if m != nil && m.OptimizeFor != nil {
		return *m.OptimizeFor
	}
	return Default_FileOptions_OptimizeFor
}

func (m *FileOptions) GetGoPackage() string {
	if m != nil && m.GoPackage != nil {
		return *m.GoPackage
	}
	return ""
}

func (m *FileOptions) GetCcGenericServices() bool {
	if m != nil && m.CcGenericServices != nil {
		return *m.CcGenericServices
	}
	return Default_FileOptions_CcGenericServices
}

func (m *FileOptions) GetJavaGenericServices() bool {
	if m != nil && m.JavaGenericServices != nil {
		return *m.JavaGenericServices
	}
	return Default_FileOptions_JavaGenericServices
}

func (m *FileOptions) GetPyGenericServices() bool {
	if m != nil && m.PyGenericServices != nil {
		return *m.PyGenericServices
	}
	return Default_FileOptions_PyGenericServices
}

func (m *FileOptions) GetPhpGenericServices() bool {
	if m != nil && m.PhpGenericServices != nil {
		return *m.PhpGenericServices
	}
	return Default_FileOptions_PhpGenericServices
}

func (m *FileOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_FileOptions_Deprecated
}

func (m *FileOptions) GetCcEnableArenas() bool {
	if m != nil && m.CcEnableArenas != nil {
		return *m.CcEnableArenas
	}
	return Default_FileOptions_CcEnableArenas
}

func (m *FileOptions) GetObjcClassPrefix() string {
	if m != nil && m.ObjcClassPrefix != nil {
		return *m.ObjcClassPrefix
	}
	return ""
}

func (m *FileOptions) GetCsharpNamespace() string {
	if m != nil && m.CsharpNamespace != nil {
		return *m.CsharpNamespace
	}
	return ""
}

func (m *FileOptions) GetSwiftPrefix() string {
	if m != nil && m.SwiftPrefix != nil {
		return *m.SwiftPrefix
	}
	return ""
}

func (m *FileOptions) GetPhpClassPrefix() string {
	if m != nil && m.PhpClassPrefix != nil {
		return *m.PhpClassPrefix
	}
	return ""
}

func (m *FileOptions) GetPhpNamespace() string {
	if m != nil && m.PhpNamespace != nil {
		return *m.PhpNamespace
	}
	return ""
}

func (m *FileOptions) GetPhpMetadataNamespace() string {
	if m != nil && m.PhpMetadataNamespace != nil {
		return *m.PhpMetadataNamespace
	}
	return ""
}

func (m *FileOptions) GetRubyPackage() string {
	if m != nil && m.RubyPackage != nil {
		return *m.RubyPackage
	}
	return ""
}

func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type MessageOptions struct {
	// Set true to use the old proto1 MessageSet wire format for extensions.
	// This is provided for backwards-compatibility with the MessageSet wire
	// format.  You should not use this for any other reason:  It's less
	// efficient, has fewer features, and is more complicated.
	//
	// The message must be defined exactly as follows:
	//   message Foo {
	//     option message_set_wire_format = true;
	//     extensions 4 to max;
	//   }
	// Note that the message cannot have any defined fields; MessageSets only
	// have extensions.
	//
	// All extensions of your type must be singular messages; e.g. they cannot
	// be int32s, enums, or repeated messages.
	//
	// Because this is an option, the above two restrictions are not enforced by
	// the protocol compiler.
	MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"`
	// Disables the generation of the standard "descriptor()" accessor, which can
	// conflict with a field of the same name.  This is meant to make migration
	// from proto1 easier; new code should avoid fields named "descriptor".
	NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"`
	// Is this message deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the message, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating messages.
	Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// Whether the message is an automatically generated map entry type for the
	// maps field.
	//
	// For maps fields:
	//     map<KeyType, ValueType> map_field = 1;
	// The parsed descriptor looks like:
	//     message MapFieldEntry {
	//         option map_entry = true;
	//         optional KeyType key = 1;
	//         optional ValueType value = 2;
	//     }
	//     repeated MapFieldEntry map_field = 1;
	//
	// Implementations may choose not to generate the map_entry=true message, but
	// use a native map in the target language to hold the keys and values.
	// The reflection APIs in such implementions still need to work as
	// if the field is a repeated message field.
	//
	// NOTE: Do not set the option in .proto files. Always use the maps syntax
	// instead. The option should only be implicitly set by the proto compiler
	// parser.
	MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_MessageOptions struct{ m *MessageOptions }

func (m *MessageOptions) ProtoReflect() protoreflect.Message {
	return xxx_MessageOptions{m}
}
func (m xxx_MessageOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[11].Type
}
func (m xxx_MessageOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[11].KnownFieldsOf(m.m)
}
func (m xxx_MessageOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[11].UnknownFieldsOf(m.m)
}
func (m xxx_MessageOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_MessageOptions) ProtoMutable() {}

func (m *MessageOptions) Reset()         { *m = MessageOptions{} }
func (m *MessageOptions) String() string { return protoapi.CompactTextString(m) }
func (*MessageOptions) ProtoMessage()    {}
func (*MessageOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{11}
}

var extRange_MessageOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*MessageOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_MessageOptions
}

const Default_MessageOptions_MessageSetWireFormat bool = false
const Default_MessageOptions_NoStandardDescriptorAccessor bool = false
const Default_MessageOptions_Deprecated bool = false

func (m *MessageOptions) GetMessageSetWireFormat() bool {
	if m != nil && m.MessageSetWireFormat != nil {
		return *m.MessageSetWireFormat
	}
	return Default_MessageOptions_MessageSetWireFormat
}

func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool {
	if m != nil && m.NoStandardDescriptorAccessor != nil {
		return *m.NoStandardDescriptorAccessor
	}
	return Default_MessageOptions_NoStandardDescriptorAccessor
}

func (m *MessageOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_MessageOptions_Deprecated
}

func (m *MessageOptions) GetMapEntry() bool {
	if m != nil && m.MapEntry != nil {
		return *m.MapEntry
	}
	return false
}

func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type FieldOptions struct {
	// The ctype option instructs the C++ code generator to use a different
	// representation of the field than it normally would.  See the specific
	// options below.  This option is not yet implemented in the open source
	// release -- sorry, we'll try to include it in a future version!
	Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"`
	// The packed option can be enabled for repeated primitive fields to enable
	// a more efficient representation on the wire. Rather than repeatedly
	// writing the tag and type for each element, the entire array is encoded as
	// a single length-delimited blob. In proto3, only explicit setting it to
	// false will avoid using packed encoding.
	Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"`
	// The jstype option determines the JavaScript type used for values of the
	// field.  The option is permitted only for 64 bit integral and fixed types
	// (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
	// is represented as JavaScript string, which avoids loss of precision that
	// can happen when a large value is converted to a floating point JavaScript.
	// Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
	// use the JavaScript "number" type.  The behavior of the default option
	// JS_NORMAL is implementation dependent.
	//
	// This option is an enum to permit additional types to be added, e.g.
	// goog.math.Integer.
	Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"`
	// Should this field be parsed lazily?  Lazy applies only to message-type
	// fields.  It means that when the outer message is initially parsed, the
	// inner message's contents will not be parsed but instead stored in encoded
	// form.  The inner message will actually be parsed when it is first accessed.
	//
	// This is only a hint.  Implementations are free to choose whether to use
	// eager or lazy parsing regardless of the value of this option.  However,
	// setting this option true suggests that the protocol author believes that
	// using lazy parsing on this field is worth the additional bookkeeping
	// overhead typically needed to implement it.
	//
	// This option does not affect the public interface of any generated code;
	// all method signatures remain the same.  Furthermore, thread-safety of the
	// interface is not affected by this option; const methods remain safe to
	// call from multiple threads concurrently, while non-const methods continue
	// to require exclusive access.
	//
	//
	// Note that implementations may choose not to check required fields within
	// a lazy sub-message.  That is, calling IsInitialized() on the outer message
	// may return true even if the inner message has missing required fields.
	// This is necessary because otherwise the inner message would have to be
	// parsed in order to perform the check, defeating the purpose of lazy
	// parsing.  An implementation which chooses not to check required fields
	// must be consistent about it.  That is, for any particular sub-message, the
	// implementation must either *always* check its required fields, or *never*
	// check its required fields, regardless of whether or not the message has
	// been parsed.
	Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"`
	// Is this field deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for accessors, or it will be completely ignored; in the very least, this
	// is a formalization for deprecating fields.
	Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// For Google-internal migration only. Do not use.
	Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_FieldOptions struct{ m *FieldOptions }

func (m *FieldOptions) ProtoReflect() protoreflect.Message {
	return xxx_FieldOptions{m}
}
func (m xxx_FieldOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[12].Type
}
func (m xxx_FieldOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[12].KnownFieldsOf(m.m)
}
func (m xxx_FieldOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[12].UnknownFieldsOf(m.m)
}
func (m xxx_FieldOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_FieldOptions) ProtoMutable() {}

func (m *FieldOptions) Reset()         { *m = FieldOptions{} }
func (m *FieldOptions) String() string { return protoapi.CompactTextString(m) }
func (*FieldOptions) ProtoMessage()    {}
func (*FieldOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{12}
}

var extRange_FieldOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*FieldOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_FieldOptions
}

const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING
const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL
const Default_FieldOptions_Lazy bool = false
const Default_FieldOptions_Deprecated bool = false
const Default_FieldOptions_Weak bool = false

func (m *FieldOptions) GetCtype() FieldOptions_CType {
	if m != nil && m.Ctype != nil {
		return *m.Ctype
	}
	return Default_FieldOptions_Ctype
}

func (m *FieldOptions) GetPacked() bool {
	if m != nil && m.Packed != nil {
		return *m.Packed
	}
	return false
}

func (m *FieldOptions) GetJstype() FieldOptions_JSType {
	if m != nil && m.Jstype != nil {
		return *m.Jstype
	}
	return Default_FieldOptions_Jstype
}

func (m *FieldOptions) GetLazy() bool {
	if m != nil && m.Lazy != nil {
		return *m.Lazy
	}
	return Default_FieldOptions_Lazy
}

func (m *FieldOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_FieldOptions_Deprecated
}

func (m *FieldOptions) GetWeak() bool {
	if m != nil && m.Weak != nil {
		return *m.Weak
	}
	return Default_FieldOptions_Weak
}

func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type OneofOptions struct {
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_OneofOptions struct{ m *OneofOptions }

func (m *OneofOptions) ProtoReflect() protoreflect.Message {
	return xxx_OneofOptions{m}
}
func (m xxx_OneofOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[13].Type
}
func (m xxx_OneofOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[13].KnownFieldsOf(m.m)
}
func (m xxx_OneofOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[13].UnknownFieldsOf(m.m)
}
func (m xxx_OneofOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_OneofOptions) ProtoMutable() {}

func (m *OneofOptions) Reset()         { *m = OneofOptions{} }
func (m *OneofOptions) String() string { return protoapi.CompactTextString(m) }
func (*OneofOptions) ProtoMessage()    {}
func (*OneofOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{13}
}

var extRange_OneofOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*OneofOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_OneofOptions
}

func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type EnumOptions struct {
	// Set this option to true to allow mapping different tag names to the same
	// value.
	AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"`
	// Is this enum deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the enum, or it will be completely ignored; in the very least, this
	// is a formalization for deprecating enums.
	Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_EnumOptions struct{ m *EnumOptions }

func (m *EnumOptions) ProtoReflect() protoreflect.Message {
	return xxx_EnumOptions{m}
}
func (m xxx_EnumOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[14].Type
}
func (m xxx_EnumOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[14].KnownFieldsOf(m.m)
}
func (m xxx_EnumOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[14].UnknownFieldsOf(m.m)
}
func (m xxx_EnumOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_EnumOptions) ProtoMutable() {}

func (m *EnumOptions) Reset()         { *m = EnumOptions{} }
func (m *EnumOptions) String() string { return protoapi.CompactTextString(m) }
func (*EnumOptions) ProtoMessage()    {}
func (*EnumOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{14}
}

var extRange_EnumOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*EnumOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_EnumOptions
}

const Default_EnumOptions_Deprecated bool = false

func (m *EnumOptions) GetAllowAlias() bool {
	if m != nil && m.AllowAlias != nil {
		return *m.AllowAlias
	}
	return false
}

func (m *EnumOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_EnumOptions_Deprecated
}

func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type EnumValueOptions struct {
	// Is this enum value deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the enum value, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating enum values.
	Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_EnumValueOptions struct{ m *EnumValueOptions }

func (m *EnumValueOptions) ProtoReflect() protoreflect.Message {
	return xxx_EnumValueOptions{m}
}
func (m xxx_EnumValueOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[15].Type
}
func (m xxx_EnumValueOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[15].KnownFieldsOf(m.m)
}
func (m xxx_EnumValueOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[15].UnknownFieldsOf(m.m)
}
func (m xxx_EnumValueOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_EnumValueOptions) ProtoMutable() {}

func (m *EnumValueOptions) Reset()         { *m = EnumValueOptions{} }
func (m *EnumValueOptions) String() string { return protoapi.CompactTextString(m) }
func (*EnumValueOptions) ProtoMessage()    {}
func (*EnumValueOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{15}
}

var extRange_EnumValueOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*EnumValueOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_EnumValueOptions
}

const Default_EnumValueOptions_Deprecated bool = false

func (m *EnumValueOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_EnumValueOptions_Deprecated
}

func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type ServiceOptions struct {
	// Is this service deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the service, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating services.
	Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_ServiceOptions struct{ m *ServiceOptions }

func (m *ServiceOptions) ProtoReflect() protoreflect.Message {
	return xxx_ServiceOptions{m}
}
func (m xxx_ServiceOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[16].Type
}
func (m xxx_ServiceOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[16].KnownFieldsOf(m.m)
}
func (m xxx_ServiceOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[16].UnknownFieldsOf(m.m)
}
func (m xxx_ServiceOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_ServiceOptions) ProtoMutable() {}

func (m *ServiceOptions) Reset()         { *m = ServiceOptions{} }
func (m *ServiceOptions) String() string { return protoapi.CompactTextString(m) }
func (*ServiceOptions) ProtoMessage()    {}
func (*ServiceOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{16}
}

var extRange_ServiceOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*ServiceOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_ServiceOptions
}

const Default_ServiceOptions_Deprecated bool = false

func (m *ServiceOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_ServiceOptions_Deprecated
}

func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type MethodOptions struct {
	// Is this method deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the method, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating methods.
	Deprecated       *bool                           `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_MethodOptions struct{ m *MethodOptions }

func (m *MethodOptions) ProtoReflect() protoreflect.Message {
	return xxx_MethodOptions{m}
}
func (m xxx_MethodOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[17].Type
}
func (m xxx_MethodOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[17].KnownFieldsOf(m.m)
}
func (m xxx_MethodOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[17].UnknownFieldsOf(m.m)
}
func (m xxx_MethodOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_MethodOptions) ProtoMutable() {}

func (m *MethodOptions) Reset()         { *m = MethodOptions{} }
func (m *MethodOptions) String() string { return protoapi.CompactTextString(m) }
func (*MethodOptions) ProtoMessage()    {}
func (*MethodOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{17}
}

var extRange_MethodOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*MethodOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_MethodOptions
}

const Default_MethodOptions_Deprecated bool = false
const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN

func (m *MethodOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_MethodOptions_Deprecated
}

func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel {
	if m != nil && m.IdempotencyLevel != nil {
		return *m.IdempotencyLevel
	}
	return Default_MethodOptions_IdempotencyLevel
}

func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

// A message representing a option the parser does not recognize. This only
// appears in options protos created by the compiler::Parser class.
// DescriptorPool resolves these when building Descriptor objects. Therefore,
// options protos in descriptor objects (e.g. returned by Descriptor::options(),
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
// in them.
type UninterpretedOption struct {
	Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"`
	// The value of the uninterpreted option, in whatever type the tokenizer
	// identified it as during parsing. Exactly one of these should be set.
	IdentifierValue      *string  `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"`
	PositiveIntValue     *uint64  `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"`
	NegativeIntValue     *int64   `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"`
	DoubleValue          *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"`
	StringValue          []byte   `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"`
	AggregateValue       *string  `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_UninterpretedOption struct{ m *UninterpretedOption }

func (m *UninterpretedOption) ProtoReflect() protoreflect.Message {
	return xxx_UninterpretedOption{m}
}
func (m xxx_UninterpretedOption) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[18].Type
}
func (m xxx_UninterpretedOption) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[18].KnownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[18].UnknownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_UninterpretedOption) ProtoMutable() {}

func (m *UninterpretedOption) Reset()         { *m = UninterpretedOption{} }
func (m *UninterpretedOption) String() string { return protoapi.CompactTextString(m) }
func (*UninterpretedOption) ProtoMessage()    {}
func (*UninterpretedOption) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{18}
}

func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *UninterpretedOption) GetIdentifierValue() string {
	if m != nil && m.IdentifierValue != nil {
		return *m.IdentifierValue
	}
	return ""
}

func (m *UninterpretedOption) GetPositiveIntValue() uint64 {
	if m != nil && m.PositiveIntValue != nil {
		return *m.PositiveIntValue
	}
	return 0
}

func (m *UninterpretedOption) GetNegativeIntValue() int64 {
	if m != nil && m.NegativeIntValue != nil {
		return *m.NegativeIntValue
	}
	return 0
}

func (m *UninterpretedOption) GetDoubleValue() float64 {
	if m != nil && m.DoubleValue != nil {
		return *m.DoubleValue
	}
	return 0
}

func (m *UninterpretedOption) GetStringValue() []byte {
	if m != nil {
		return m.StringValue
	}
	return nil
}

func (m *UninterpretedOption) GetAggregateValue() string {
	if m != nil && m.AggregateValue != nil {
		return *m.AggregateValue
	}
	return ""
}

// The name of the uninterpreted option.  Each string represents a segment in
// a dot-separated name.  is_extension is true iff a segment represents an
// extension (denoted with parentheses in options specs in .proto files).
// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
// "foo.(bar.baz).qux".
type UninterpretedOption_NamePart struct {
	NamePart             *string  `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"`
	IsExtension          *bool    `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_UninterpretedOption_NamePart struct{ m *UninterpretedOption_NamePart }

func (m *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message {
	return xxx_UninterpretedOption_NamePart{m}
}
func (m xxx_UninterpretedOption_NamePart) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[24].Type
}
func (m xxx_UninterpretedOption_NamePart) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[24].KnownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption_NamePart) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[24].UnknownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption_NamePart) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_UninterpretedOption_NamePart) ProtoMutable() {}

func (m *UninterpretedOption_NamePart) Reset()         { *m = UninterpretedOption_NamePart{} }
func (m *UninterpretedOption_NamePart) String() string { return protoapi.CompactTextString(m) }
func (*UninterpretedOption_NamePart) ProtoMessage()    {}
func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{18, 0}
}

func (m *UninterpretedOption_NamePart) GetNamePart() string {
	if m != nil && m.NamePart != nil {
		return *m.NamePart
	}
	return ""
}

func (m *UninterpretedOption_NamePart) GetIsExtension() bool {
	if m != nil && m.IsExtension != nil {
		return *m.IsExtension
	}
	return false
}

// Encapsulates information about the original source file from which a
// FileDescriptorProto was generated.
type SourceCodeInfo struct {
	// A Location identifies a piece of source code in a .proto file which
	// corresponds to a particular definition.  This information is intended
	// to be useful to IDEs, code indexers, documentation generators, and similar
	// tools.
	//
	// For example, say we have a file like:
	//   message Foo {
	//     optional string foo = 1;
	//   }
	// Let's look at just the field definition:
	//   optional string foo = 1;
	//   ^       ^^     ^^  ^  ^^^
	//   a       bc     de  f  ghi
	// We have the following locations:
	//   span   path               represents
	//   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
	//   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
	//   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
	//   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
	//   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
	//
	// Notes:
	// - A location may refer to a repeated field itself (i.e. not to any
	//   particular index within it).  This is used whenever a set of elements are
	//   logically enclosed in a single code segment.  For example, an entire
	//   extend block (possibly containing multiple extension definitions) will
	//   have an outer location whose path refers to the "extensions" repeated
	//   field without an index.
	// - Multiple locations may have the same path.  This happens when a single
	//   logical declaration is spread out across multiple places.  The most
	//   obvious example is the "extend" block again -- there may be multiple
	//   extend blocks in the same scope, each of which will have the same path.
	// - A location's span is not always a subset of its parent's span.  For
	//   example, the "extendee" of an extension declaration appears at the
	//   beginning of the "extend" block and is shared by all extensions within
	//   the block.
	// - Just because a location's span is a subset of some other location's span
	//   does not mean that it is a descendent.  For example, a "group" defines
	//   both a type and a field in a single declaration.  Thus, the locations
	//   corresponding to the type and field and their components will overlap.
	// - Code which tries to interpret locations should probably be designed to
	//   ignore those that it doesn't understand, as more types of locations could
	//   be recorded in the future.
	Location             []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

type xxx_SourceCodeInfo struct{ m *SourceCodeInfo }

func (m *SourceCodeInfo) ProtoReflect() protoreflect.Message {
	return xxx_SourceCodeInfo{m}
}
func (m xxx_SourceCodeInfo) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[19].Type
}
func (m xxx_SourceCodeInfo) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[19].KnownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[19].UnknownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_SourceCodeInfo) ProtoMutable() {}

func (m *SourceCodeInfo) Reset()         { *m = SourceCodeInfo{} }
func (m *SourceCodeInfo) String() string { return protoapi.CompactTextString(m) }
func (*SourceCodeInfo) ProtoMessage()    {}
func (*SourceCodeInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{19}
}

func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location {
	if m != nil {
		return m.Location
	}
	return nil
}

type SourceCodeInfo_Location struct {
	// Identifies which part of the FileDescriptorProto was defined at this
	// location.
	//
	// Each element is a field number or an index.  They form a path from
	// the root FileDescriptorProto to the place where the definition.  For
	// example, this path:
	//   [ 4, 3, 2, 7, 1 ]
	// refers to:
	//   file.message_type(3)  // 4, 3
	//       .field(7)         // 2, 7
	//       .name()           // 1
	// This is because FileDescriptorProto.message_type has field number 4:
	//   repeated DescriptorProto message_type = 4;
	// and DescriptorProto.field has field number 2:
	//   repeated FieldDescriptorProto field = 2;
	// and FieldDescriptorProto.name has field number 1:
	//   optional string name = 1;
	//
	// Thus, the above path gives the location of a field name.  If we removed
	// the last element:
	//   [ 4, 3, 2, 7 ]
	// this path refers to the whole field declaration (from the beginning
	// of the label to the terminating semicolon).
	Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"`
	// Always has exactly three or four elements: start line, start column,
	// end line (optional, otherwise assumed same as start line), end column.
	// These are packed into a single field for efficiency.  Note that line
	// and column numbers are zero-based -- typically you will want to add
	// 1 to each before displaying to a user.
	Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"`
	// If this SourceCodeInfo represents a complete declaration, these are any
	// comments appearing before and after the declaration which appear to be
	// attached to the declaration.
	//
	// A series of line comments appearing on consecutive lines, with no other
	// tokens appearing on those lines, will be treated as a single comment.
	//
	// leading_detached_comments will keep paragraphs of comments that appear
	// before (but not connected to) the current element. Each paragraph,
	// separated by empty lines, will be one comment element in the repeated
	// field.
	//
	// Only the comment content is provided; comment markers (e.g. //) are
	// stripped out.  For block comments, leading whitespace and an asterisk
	// will be stripped from the beginning of each line other than the first.
	// Newlines are included in the output.
	//
	// Examples:
	//
	//   optional int32 foo = 1;  // Comment attached to foo.
	//   // Comment attached to bar.
	//   optional int32 bar = 2;
	//
	//   optional string baz = 3;
	//   // Comment attached to baz.
	//   // Another line attached to baz.
	//
	//   // Comment attached to qux.
	//   //
	//   // Another line attached to qux.
	//   optional double qux = 4;
	//
	//   // Detached comment for corge. This is not leading or trailing comments
	//   // to qux or corge because there are blank lines separating it from
	//   // both.
	//
	//   // Detached comment for corge paragraph 2.
	//
	//   optional string corge = 5;
	//   /* Block comment attached
	//    * to corge.  Leading asterisks
	//    * will be removed. */
	//   /* Block comment attached to
	//    * grault. */
	//   optional int32 grault = 6;
	//
	//   // ignored detached comments.
	LeadingComments         *string  `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"`
	TrailingComments        *string  `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"`
	LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

type xxx_SourceCodeInfo_Location struct{ m *SourceCodeInfo_Location }

func (m *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message {
	return xxx_SourceCodeInfo_Location{m}
}
func (m xxx_SourceCodeInfo_Location) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[25].Type
}
func (m xxx_SourceCodeInfo_Location) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[25].KnownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo_Location) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[25].UnknownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo_Location) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_SourceCodeInfo_Location) ProtoMutable() {}

func (m *SourceCodeInfo_Location) Reset()         { *m = SourceCodeInfo_Location{} }
func (m *SourceCodeInfo_Location) String() string { return protoapi.CompactTextString(m) }
func (*SourceCodeInfo_Location) ProtoMessage()    {}
func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{19, 0}
}

func (m *SourceCodeInfo_Location) GetPath() []int32 {
	if m != nil {
		return m.Path
	}
	return nil
}

func (m *SourceCodeInfo_Location) GetSpan() []int32 {
	if m != nil {
		return m.Span
	}
	return nil
}

func (m *SourceCodeInfo_Location) GetLeadingComments() string {
	if m != nil && m.LeadingComments != nil {
		return *m.LeadingComments
	}
	return ""
}

func (m *SourceCodeInfo_Location) GetTrailingComments() string {
	if m != nil && m.TrailingComments != nil {
		return *m.TrailingComments
	}
	return ""
}

func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string {
	if m != nil {
		return m.LeadingDetachedComments
	}
	return nil
}

// Describes the relationship between generated code and its original source
// file. A GeneratedCodeInfo message is associated with only one generated
// source file, but may contain references to different source .proto files.
type GeneratedCodeInfo struct {
	// An Annotation connects some span of text in generated code to an element
	// of its generating .proto file.
	Annotation           []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

type xxx_GeneratedCodeInfo struct{ m *GeneratedCodeInfo }

func (m *GeneratedCodeInfo) ProtoReflect() protoreflect.Message {
	return xxx_GeneratedCodeInfo{m}
}
func (m xxx_GeneratedCodeInfo) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[20].Type
}
func (m xxx_GeneratedCodeInfo) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[20].KnownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[20].UnknownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_GeneratedCodeInfo) ProtoMutable() {}

func (m *GeneratedCodeInfo) Reset()         { *m = GeneratedCodeInfo{} }
func (m *GeneratedCodeInfo) String() string { return protoapi.CompactTextString(m) }
func (*GeneratedCodeInfo) ProtoMessage()    {}
func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{20}
}

func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation {
	if m != nil {
		return m.Annotation
	}
	return nil
}

type GeneratedCodeInfo_Annotation struct {
	// Identifies the element in the original source .proto file. This field
	// is formatted the same as SourceCodeInfo.Location.path.
	Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"`
	// Identifies the filesystem path to the original source .proto.
	SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"`
	// Identifies the starting offset in bytes in the generated code
	// that relates to the identified object.
	Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"`
	// Identifies the ending offset in bytes in the generated code that
	// relates to the identified offset. The end offset should be one past
	// the last relevant byte (so the length of the text = end - begin).
	End                  *int32   `protobuf:"varint,4,opt,name=end" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_GeneratedCodeInfo_Annotation struct{ m *GeneratedCodeInfo_Annotation }

func (m *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message {
	return xxx_GeneratedCodeInfo_Annotation{m}
}
func (m xxx_GeneratedCodeInfo_Annotation) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[26].Type
}
func (m xxx_GeneratedCodeInfo_Annotation) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[26].KnownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo_Annotation) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[26].UnknownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo_Annotation) Interface() protoreflect.ProtoMessage {
	return m.m
}
func (m xxx_GeneratedCodeInfo_Annotation) ProtoMutable() {}

func (m *GeneratedCodeInfo_Annotation) Reset()         { *m = GeneratedCodeInfo_Annotation{} }
func (m *GeneratedCodeInfo_Annotation) String() string { return protoapi.CompactTextString(m) }
func (*GeneratedCodeInfo_Annotation) ProtoMessage()    {}
func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{20, 0}
}

func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 {
	if m != nil {
		return m.Path
	}
	return nil
}

func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string {
	if m != nil && m.SourceFile != nil {
		return *m.SourceFile
	}
	return ""
}

func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 {
	if m != nil && m.Begin != nil {
		return *m.Begin
	}
	return 0
}

func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

func init() {
	protoapi.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value)
	protoapi.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value)
	protoapi.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value)
	protoapi.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value)
	protoapi.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value)
	protoapi.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value)
	protoapi.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet")
	protoapi.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto")
	protoapi.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto")
	protoapi.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange")
	protoapi.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange")
	protoapi.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions")
	protoapi.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto")
	protoapi.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto")
	protoapi.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto")
	protoapi.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange")
	protoapi.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto")
	protoapi.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto")
	protoapi.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto")
	protoapi.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions")
	protoapi.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions")
	protoapi.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions")
	protoapi.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions")
	protoapi.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions")
	protoapi.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions")
	protoapi.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions")
	protoapi.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions")
	protoapi.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption")
	protoapi.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart")
	protoapi.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo")
	protoapi.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location")
	protoapi.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo")
	protoapi.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation")
}

func init() {
	protoapi.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_e5baabe45344a177)
}

var fileDescriptor_e5baabe45344a177 = []byte{
	// 2589 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdd, 0x6e, 0x1b, 0xc7,
	0xf5, 0xcf, 0xf2, 0x4b, 0xe4, 0x21, 0x45, 0x8d, 0x46, 0x8a, 0xbd, 0x56, 0x3e, 0x2c, 0x33, 0x1f,
	0x96, 0x9d, 0x84, 0x0a, 0x14, 0xdb, 0x71, 0xe4, 0x3f, 0x92, 0x3f, 0x45, 0xae, 0x15, 0xba, 0x12,
	0xc9, 0x2e, 0xa9, 0xe6, 0x03, 0x28, 0x16, 0xa3, 0xdd, 0x21, 0xb9, 0xf6, 0x72, 0x77, 0xb3, 0xbb,
	0xb4, 0xad, 0xa0, 0x17, 0x06, 0x7a, 0xd5, 0xbb, 0xa2, 0x57, 0x45, 0x51, 0xf4, 0xa2, 0x37, 0x01,
	0xfa, 0x00, 0x05, 0x7a, 0xd7, 0x27, 0x28, 0x90, 0x37, 0x28, 0xda, 0x02, 0xed, 0x23, 0xf4, 0xb2,
	0x98, 0x99, 0xdd, 0xe5, 0x2e, 0x49, 0xc5, 0x4a, 0x80, 0x24, 0x57, 0xe4, 0xfc, 0xce, 0xef, 0x9c,
	0x39, 0x73, 0xe6, 0xcc, 0xcc, 0x99, 0x59, 0xd8, 0x1e, 0x39, 0xce, 0xc8, 0xa2, 0xbb, 0xae, 0xe7,
	0x04, 0xce, 0xe9, 0x74, 0xb8, 0x6b, 0x50, 0x5f, 0xf7, 0x4c, 0x37, 0x70, 0xbc, 0x3a, 0xc7, 0xf0,
	0x9a, 0x60, 0xd4, 0x23, 0x46, 0xed, 0x18, 0xd6, 0xef, 0x9b, 0x16, 0x6d, 0xc5, 0xc4, 0x3e, 0x0d,
	0xf0, 0x5d, 0xc8, 0x0d, 0x4d, 0x8b, 0xca, 0xd2, 0x76, 0x76, 0xa7, 0xbc, 0xf7, 0x7a, 0x7d, 0x4e,
	0xa9, 0x9e, 0xd6, 0xe8, 0x31, 0x58, 0xe5, 0x1a, 0xb5, 0x7f, 0xe5, 0x60, 0x63, 0x89, 0x14, 0x63,
	0xc8, 0xd9, 0x64, 0xc2, 0x2c, 0x4a, 0x3b, 0x25, 0x95, 0xff, 0xc7, 0x32, 0xac, 0xb8, 0x44, 0x7f,
	0x44, 0x46, 0x54, 0xce, 0x70, 0x38, 0x6a, 0xe2, 0x57, 0x01, 0x0c, 0xea, 0x52, 0xdb, 0xa0, 0xb6,
	0x7e, 0x26, 0x67, 0xb7, 0xb3, 0x3b, 0x25, 0x35, 0x81, 0xe0, 0xb7, 0x60, 0xdd, 0x9d, 0x9e, 0x5a,
	0xa6, 0xae, 0x25, 0x68, 0xb0, 0x9d, 0xdd, 0xc9, 0xab, 0x48, 0x08, 0x5a, 0x33, 0xf2, 0x75, 0x58,
	0x7b, 0x42, 0xc9, 0xa3, 0x24, 0xb5, 0xcc, 0xa9, 0x55, 0x06, 0x27, 0x88, 0x4d, 0xa8, 0x4c, 0xa8,
	0xef, 0x93, 0x11, 0xd5, 0x82, 0x33, 0x97, 0xca, 0x39, 0x3e, 0xfa, 0xed, 0x85, 0xd1, 0xcf, 0x8f,
	0xbc, 0x1c, 0x6a, 0x0d, 0xce, 0x5c, 0x8a, 0x1b, 0x50, 0xa2, 0xf6, 0x74, 0x22, 0x2c, 0xe4, 0xcf,
	0x89, 0x9f, 0x62, 0x4f, 0x27, 0xf3, 0x56, 0x8a, 0x4c, 0x2d, 0x34, 0xb1, 0xe2, 0x53, 0xef, 0xb1,
	0xa9, 0x53, 0xb9, 0xc0, 0x0d, 0x5c, 0x5f, 0x30, 0xd0, 0x17, 0xf2, 0x79, 0x1b, 0x91, 0x1e, 0x6e,
	0x42, 0x89, 0x3e, 0x0d, 0xa8, 0xed, 0x9b, 0x8e, 0x2d, 0xaf, 0x70, 0x23, 0x6f, 0x2c, 0x99, 0x45,
	0x6a, 0x19, 0xf3, 0x26, 0x66, 0x7a, 0xf8, 0x0e, 0xac, 0x38, 0x6e, 0x60, 0x3a, 0xb6, 0x2f, 0x17,
	0xb7, 0xa5, 0x9d, 0xf2, 0xde, 0xcb, 0x4b, 0x13, 0xa1, 0x2b, 0x38, 0x6a, 0x44, 0xc6, 0x6d, 0x40,
	0xbe, 0x33, 0xf5, 0x74, 0xaa, 0xe9, 0x8e, 0x41, 0x35, 0xd3, 0x1e, 0x3a, 0x72, 0x89, 0x1b, 0xb8,
	0xba, 0x38, 0x10, 0x4e, 0x6c, 0x3a, 0x06, 0x6d, 0xdb, 0x43, 0x47, 0xad, 0xfa, 0xa9, 0x36, 0xbe,
	0x04, 0x05, 0xff, 0xcc, 0x0e, 0xc8, 0x53, 0xb9, 0xc2, 0x33, 0x24, 0x6c, 0xd5, 0xfe, 0x52, 0x80,
	0xb5, 0x8b, 0xa4, 0xd8, 0x3d, 0xc8, 0x0f, 0xd9, 0x28, 0xe5, 0xcc, 0xb7, 0x89, 0x81, 0xd0, 0x49,
	0x07, 0xb1, 0xf0, 0x1d, 0x83, 0xd8, 0x80, 0xb2, 0x4d, 0xfd, 0x80, 0x1a, 0x22, 0x23, 0xb2, 0x17,
	0xcc, 0x29, 0x10, 0x4a, 0x8b, 0x29, 0x95, 0xfb, 0x4e, 0x29, 0xf5, 0x29, 0xac, 0xc5, 0x2e, 0x69,
	0x1e, 0xb1, 0x47, 0x51, 0x6e, 0xee, 0x3e, 0xcf, 0x93, 0xba, 0x12, 0xe9, 0xa9, 0x4c, 0x4d, 0xad,
	0xd2, 0x54, 0x1b, 0xb7, 0x00, 0x1c, 0x9b, 0x3a, 0x43, 0xcd, 0xa0, 0xba, 0x25, 0x17, 0xcf, 0x89,
	0x52, 0x97, 0x51, 0x16, 0xa2, 0xe4, 0x08, 0x54, 0xb7, 0xf0, 0x07, 0xb3, 0x54, 0x5b, 0x39, 0x27,
	0x53, 0x8e, 0xc5, 0x22, 0x5b, 0xc8, 0xb6, 0x13, 0xa8, 0x7a, 0x94, 0xe5, 0x3d, 0x35, 0xc2, 0x91,
	0x95, 0xb8, 0x13, 0xf5, 0xe7, 0x8e, 0x4c, 0x0d, 0xd5, 0xc4, 0xc0, 0x56, 0xbd, 0x64, 0x13, 0xbf,
	0x06, 0x31, 0xa0, 0xf1, 0xb4, 0x02, 0xbe, 0x0b, 0x55, 0x22, 0xb0, 0x43, 0x26, 0x74, 0xeb, 0x4b,
	0xa8, 0xa6, 0xc3, 0x83, 0x37, 0x21, 0xef, 0x07, 0xc4, 0x0b, 0x78, 0x16, 0xe6, 0x55, 0xd1, 0xc0,
	0x08, 0xb2, 0xd4, 0x36, 0xf8, 0x2e, 0x97, 0x57, 0xd9, 0x5f, 0xfc, 0xff, 0xb3, 0x01, 0x67, 0xf9,
	0x80, 0xdf, 0x5c, 0x9c, 0xd1, 0x94, 0xe5, 0xf9, 0x71, 0x6f, 0xbd, 0x0f, 0xab, 0xa9, 0x01, 0x5c,
	0xb4, 0xeb, 0xda, 0x2f, 0xe0, 0xc5, 0xa5, 0xa6, 0xf1, 0xa7, 0xb0, 0x39, 0xb5, 0x4d, 0x3b, 0xa0,
	0x9e, 0xeb, 0x51, 0x96, 0xb1, 0xa2, 0x2b, 0xf9, 0xdf, 0x2b, 0xe7, 0xe4, 0xdc, 0x49, 0x92, 0x2d,
	0xac, 0xa8, 0x1b, 0xd3, 0x45, 0xf0, 0x66, 0xa9, 0xf8, 0x9f, 0x15, 0xf4, 0xec, 0xd9, 0xb3, 0x67,
	0x99, 0xda, 0x6f, 0x0b, 0xb0, 0xb9, 0x6c, 0xcd, 0x2c, 0x5d, 0xbe, 0x97, 0xa0, 0x60, 0x4f, 0x27,
	0xa7, 0xd4, 0xe3, 0x41, 0xca, 0xab, 0x61, 0x0b, 0x37, 0x20, 0x6f, 0x91, 0x53, 0x6a, 0xc9, 0xb9,
	0x6d, 0x69, 0xa7, 0xba, 0xf7, 0xd6, 0x85, 0x56, 0x65, 0xfd, 0x88, 0xa9, 0xa8, 0x42, 0x13, 0x7f,
	0x08, 0xb9, 0x70, 0x8b, 0x66, 0x16, 0x6e, 0x5e, 0xcc, 0x02, 0x5b, 0x4b, 0x2a, 0xd7, 0xc3, 0x2f,
	0x41, 0x89, 0xfd, 0x8a, 0xdc, 0x28, 0x70, 0x9f, 0x8b, 0x0c, 0x60, 0x79, 0x81, 0xb7, 0xa0, 0xc8,
	0x97, 0x89, 0x41, 0xa3, 0xa3, 0x2d, 0x6e, 0xb3, 0xc4, 0x32, 0xe8, 0x90, 0x4c, 0xad, 0x40, 0x7b,
	0x4c, 0xac, 0x29, 0xe5, 0x09, 0x5f, 0x52, 0x2b, 0x21, 0xf8, 0x33, 0x86, 0xe1, 0xab, 0x50, 0x16,
	0xab, 0xca, 0xb4, 0x0d, 0xfa, 0x94, 0xef, 0x9e, 0x79, 0x55, 0x2c, 0xb4, 0x36, 0x43, 0x58, 0xf7,
	0x0f, 0x7d, 0xc7, 0x8e, 0x52, 0x93, 0x77, 0xc1, 0x00, 0xde, 0xfd, 0xfb, 0xf3, 0x1b, 0xf7, 0x2b,
	0xcb, 0x87, 0x37, 0x9f, 0x53, 0xb5, 0x3f, 0x67, 0x20, 0xc7, 0xf7, 0x8b, 0x35, 0x28, 0x0f, 0x3e,
	0xeb, 0x29, 0x5a, 0xab, 0x7b, 0x72, 0x70, 0xa4, 0x20, 0x09, 0x57, 0x01, 0x38, 0x70, 0xff, 0xa8,
	0xdb, 0x18, 0xa0, 0x4c, 0xdc, 0x6e, 0x77, 0x06, 0x77, 0x6e, 0xa1, 0x6c, 0xac, 0x70, 0x22, 0x80,
	0x5c, 0x92, 0xf0, 0xde, 0x1e, 0xca, 0x63, 0x04, 0x15, 0x61, 0xa0, 0xfd, 0xa9, 0xd2, 0xba, 0x73,
	0x0b, 0x15, 0xd2, 0xc8, 0x7b, 0x7b, 0x68, 0x05, 0xaf, 0x42, 0x89, 0x23, 0x07, 0xdd, 0xee, 0x11,
	0x2a, 0xc6, 0x36, 0xfb, 0x03, 0xb5, 0xdd, 0x39, 0x44, 0xa5, 0xd8, 0xe6, 0xa1, 0xda, 0x3d, 0xe9,
	0x21, 0x88, 0x2d, 0x1c, 0x2b, 0xfd, 0x7e, 0xe3, 0x50, 0x41, 0xe5, 0x98, 0x71, 0xf0, 0xd9, 0x40,
	0xe9, 0xa3, 0x4a, 0xca, 0xad, 0xf7, 0xf6, 0xd0, 0x6a, 0xdc, 0x85, 0xd2, 0x39, 0x39, 0x46, 0x55,
	0xbc, 0x0e, 0xab, 0xa2, 0x8b, 0xc8, 0x89, 0xb5, 0x39, 0xe8, 0xce, 0x2d, 0x84, 0x66, 0x8e, 0x08,
	0x2b, 0xeb, 0x29, 0xe0, 0xce, 0x2d, 0x84, 0x6b, 0x4d, 0xc8, 0xf3, 0xec, 0xc2, 0x18, 0xaa, 0x47,
	0x8d, 0x03, 0xe5, 0x48, 0xeb, 0xf6, 0x06, 0xed, 0x6e, 0xa7, 0x71, 0x84, 0xa4, 0x19, 0xa6, 0x2a,
	0x3f, 0x3d, 0x69, 0xab, 0x4a, 0x0b, 0x65, 0x92, 0x58, 0x4f, 0x69, 0x0c, 0x94, 0x16, 0xca, 0xd6,
	0x74, 0xd8, 0x5c, 0xb6, 0x4f, 0x2e, 0x5d, 0x19, 0x89, 0x29, 0xce, 0x9c, 0x33, 0xc5, 0xdc, 0xd6,
	0xc2, 0x14, 0xff, 0x33, 0x03, 0x1b, 0x4b, 0xce, 0x8a, 0xa5, 0x9d, 0x7c, 0x04, 0x79, 0x91, 0xa2,
	0xe2, 0xf4, 0xbc, 0xb1, 0xf4, 0xd0, 0xe1, 0x09, 0xbb, 0x70, 0x82, 0x72, 0xbd, 0x64, 0x05, 0x91,
	0x3d, 0xa7, 0x82, 0x60, 0x26, 0x16, 0xf6, 0xf4, 0x9f, 0x2f, 0xec, 0xe9, 0xe2, 0xd8, 0xbb, 0x73,
	0x91, 0x63, 0x8f, 0x63, 0xdf, 0x6e, 0x6f, 0xcf, 0x2f, 0xd9, 0xdb, 0xef, 0xc1, 0xfa, 0x82, 0xa1,
	0x0b, 0xef, 0xb1, 0xbf, 0x94, 0x40, 0x3e, 0x2f, 0x38, 0xcf, 0xd9, 0xe9, 0x32, 0xa9, 0x9d, 0xee,
	0xde, 0x7c, 0x04, 0xaf, 0x9d, 0x3f, 0x09, 0x0b, 0x73, 0xfd, 0x95, 0x04, 0x97, 0x96, 0x57, 0x8a,
	0x4b, 0x7d, 0xf8, 0x10, 0x0a, 0x13, 0x1a, 0x8c, 0x9d, 0xa8, 0x5a, 0x7a, 0x73, 0xc9, 0x19, 0xcc,
	0xc4, 0xf3, 0x93, 0x1d, 0x6a, 0x25, 0x0f, 0xf1, 0xec, 0x79, 0xe5, 0x9e, 0xf0, 0x66, 0xc1, 0xd3,
	0x5f, 0x65, 0xe0, 0xc5, 0xa5, 0xc6, 0x97, 0x3a, 0xfa, 0x0a, 0x80, 0x69, 0xbb, 0xd3, 0x40, 0x54,
	0x44, 0x62, 0x83, 0x2d, 0x71, 0x84, 0x6f, 0x5e, 0x6c, 0xf3, 0x9c, 0x06, 0xb1, 0x3c, 0xcb, 0xe5,
	0x20, 0x20, 0x4e, 0xb8, 0x3b, 0x73, 0x34, 0xc7, 0x1d, 0x7d, 0xf5, 0x9c, 0x91, 0x2e, 0x24, 0xe6,
	0xbb, 0x80, 0x74, 0xcb, 0xa4, 0x76, 0xa0, 0xf9, 0x81, 0x47, 0xc9, 0xc4, 0xb4, 0x47, 0xfc, 0x04,
	0x29, 0xee, 0xe7, 0x87, 0xc4, 0xf2, 0xa9, 0xba, 0x26, 0xc4, 0xfd, 0x48, 0xca, 0x34, 0x78, 0x02,
	0x79, 0x09, 0x8d, 0x42, 0x4a, 0x43, 0x88, 0x63, 0x8d, 0xda, 0x6f, 0x4a, 0x50, 0x4e, 0xd4, 0xd5,
	0xf8, 0x1a, 0x54, 0x1e, 0x92, 0xc7, 0x44, 0x8b, 0xee, 0x4a, 0x22, 0x12, 0x65, 0x86, 0xf5, 0xc2,
	0xfb, 0xd2, 0xbb, 0xb0, 0xc9, 0x29, 0xce, 0x34, 0xa0, 0x9e, 0xa6, 0x5b, 0xc4, 0xf7, 0x79, 0xd0,
	0x8a, 0x9c, 0x8a, 0x99, 0xac, 0xcb, 0x44, 0xcd, 0x48, 0x82, 0x6f, 0xc3, 0x06, 0xd7, 0x98, 0x4c,
	0xad, 0xc0, 0x74, 0x2d, 0xaa, 0xb1, 0xdb, 0x9b, 0xcf, 0x4f, 0x92, 0xd8, 0xb3, 0x75, 0xc6, 0x38,
	0x0e, 0x09, 0xcc, 0x23, 0x1f, 0xb7, 0xe0, 0x15, 0xae, 0x36, 0xa2, 0x36, 0xf5, 0x48, 0x40, 0x35,
	0xfa, 0xc5, 0x94, 0x58, 0xbe, 0x46, 0x6c, 0x43, 0x1b, 0x13, 0x7f, 0x2c, 0x6f, 0x32, 0x03, 0x07,
	0x19, 0x59, 0x52, 0xaf, 0x30, 0xe2, 0x61, 0xc8, 0x53, 0x38, 0xad, 0x61, 0x1b, 0x1f, 0x13, 0x7f,
	0x8c, 0xf7, 0xe1, 0x12, 0xb7, 0xe2, 0x07, 0x9e, 0x69, 0x8f, 0x34, 0x7d, 0x4c, 0xf5, 0x47, 0xda,
	0x34, 0x18, 0xde, 0x95, 0x5f, 0x4a, 0xf6, 0xcf, 0x3d, 0xec, 0x73, 0x4e, 0x93, 0x51, 0x4e, 0x82,
	0xe1, 0x5d, 0xdc, 0x87, 0x0a, 0x9b, 0x8c, 0x89, 0xf9, 0x25, 0xd5, 0x86, 0x8e, 0xc7, 0x8f, 0xc6,
	0xea, 0x92, 0xad, 0x29, 0x11, 0xc1, 0x7a, 0x37, 0x54, 0x38, 0x76, 0x0c, 0xba, 0x9f, 0xef, 0xf7,
	0x14, 0xa5, 0xa5, 0x96, 0x23, 0x2b, 0xf7, 0x1d, 0x8f, 0x25, 0xd4, 0xc8, 0x89, 0x03, 0x5c, 0x16,
	0x09, 0x35, 0x72, 0xa2, 0xf0, 0xde, 0x86, 0x0d, 0x5d, 0x17, 0x63, 0x36, 0x75, 0x2d, 0xbc, 0x63,
	0xf9, 0x32, 0x4a, 0x05, 0x4b, 0xd7, 0x0f, 0x05, 0x21, 0xcc, 0x71, 0x1f, 0x7f, 0x00, 0x2f, 0xce,
	0x82, 0x95, 0x54, 0x5c, 0x5f, 0x18, 0xe5, 0xbc, 0xea, 0x6d, 0xd8, 0x70, 0xcf, 0x16, 0x15, 0x71,
	0xaa, 0x47, 0xf7, 0x6c, 0x5e, 0xed, 0x7d, 0xd8, 0x74, 0xc7, 0xee, 0xa2, 0xde, 0xcd, 0xa4, 0x1e,
	0x76, 0xc7, 0xee, 0xbc, 0xe2, 0x1b, 0xfc, 0xc2, 0xed, 0x51, 0x9d, 0x04, 0xd4, 0x90, 0x2f, 0x27,
	0xe9, 0x09, 0x01, 0xde, 0x05, 0xa4, 0xeb, 0x1a, 0xb5, 0xc9, 0xa9, 0x45, 0x35, 0xe2, 0x51, 0x9b,
	0xf8, 0xf2, 0xd5, 0x24, 0xb9, 0xaa, 0xeb, 0x0a, 0x97, 0x36, 0xb8, 0x10, 0xdf, 0x84, 0x75, 0xe7,
	0xf4, 0xa1, 0x2e, 0x52, 0x52, 0x73, 0x3d, 0x3a, 0x34, 0x9f, 0xca, 0xaf, 0xf3, 0xf8, 0xae, 0x31,
	0x01, 0x4f, 0xc8, 0x1e, 0x87, 0xf1, 0x0d, 0x40, 0xba, 0x3f, 0x26, 0x9e, 0xcb, 0xf7, 0x64, 0xdf,
	0x25, 0x3a, 0x95, 0xdf, 0x10, 0x54, 0x81, 0x77, 0x22, 0x98, 0x2d, 0x09, 0xff, 0x89, 0x39, 0x0c,
	0x22, 0x8b, 0xd7, 0xc5, 0x92, 0xe0, 0x58, 0x68, 0x6d, 0x07, 0x10, 0x0b, 0x45, 0xaa, 0xe3, 0x1d,
	0x4e, 0xab, 0xba, 0x63, 0x37, 0xd9, 0xef, 0x6b, 0xb0, 0xca, 0x98, 0xb3, 0x4e, 0x6f, 0x88, 0x82,
	0xcc, 0x1d, 0x27, 0x7a, 0xbc, 0x05, 0x97, 0x18, 0x69, 0x42, 0x03, 0x62, 0x90, 0x80, 0x24, 0xd8,
	0x6f, 0x73, 0x36, 0x8b, 0xfb, 0x71, 0x28, 0x4c, 0xf9, 0xe9, 0x4d, 0x4f, 0xcf, 0xe2, 0xcc, 0x7a,
	0x47, 0xf8, 0xc9, 0xb0, 0x28, 0xb7, 0xbe, 0xb7, 0xa2, 0xbb, 0xb6, 0x0f, 0x95, 0x64, 0xe2, 0xe3,
	0x12, 0x88, 0xd4, 0x47, 0x12, 0xab, 0x82, 0x9a, 0xdd, 0x16, 0xab, 0x5f, 0x3e, 0x57, 0x50, 0x86,
	0xd5, 0x51, 0x47, 0xed, 0x81, 0xa2, 0xa9, 0x27, 0x9d, 0x41, 0xfb, 0x58, 0x41, 0xd9, 0x44, 0xc1,
	0xfe, 0x20, 0x57, 0x7c, 0x13, 0x5d, 0xaf, 0x7d, 0x9d, 0x81, 0x6a, 0xfa, 0x06, 0x86, 0xff, 0x0f,
	0x2e, 0x47, 0xcf, 0x25, 0x3e, 0x0d, 0xb4, 0x27, 0xa6, 0xc7, 0x57, 0xe4, 0x84, 0x88, 0xd3, 0x31,
	0xce, 0x89, 0xcd, 0x90, 0xd5, 0xa7, 0xc1, 0x27, 0xa6, 0xc7, 0xd6, 0xdb, 0x84, 0x04, 0xf8, 0x08,
	0xae, 0xda, 0x8e, 0xe6, 0x07, 0xc4, 0x36, 0x88, 0x67, 0x68, 0xb3, 0x87, 0x2a, 0x8d, 0xe8, 0x3a,
	0xf5, 0x7d, 0x47, 0x9c, 0x84, 0xb1, 0x95, 0x97, 0x6d, 0xa7, 0x1f, 0x92, 0x67, 0x47, 0x44, 0x23,
	0xa4, 0xce, 0xe5, 0x6f, 0xf6, 0xbc, 0xfc, 0x7d, 0x09, 0x4a, 0x13, 0xe2, 0x6a, 0xd4, 0x0e, 0xbc,
	0x33, 0x5e, 0x77, 0x17, 0xd5, 0xe2, 0x84, 0xb8, 0x0a, 0x6b, 0xff, 0x20, 0xd7, 0x9f, 0x07, 0xb9,
	0x62, 0x11, 0x95, 0x1e, 0xe4, 0x8a, 0x25, 0x04, 0xb5, 0x7f, 0x64, 0xa1, 0x92, 0xac, 0xc3, 0xd9,
	0xb5, 0x46, 0xe7, 0x47, 0x96, 0xc4, 0x37, 0xb5, 0xd7, 0xbe, 0xb1, 0x6a, 0xaf, 0x37, 0xd9, 0x59,
	0xb6, 0x5f, 0x10, 0xd5, 0xb1, 0x2a, 0x34, 0x59, 0x1d, 0xc1, 0x92, 0x8d, 0x8a, 0x6a, 0xa4, 0xa8,
	0x86, 0x2d, 0x7c, 0x08, 0x85, 0x87, 0x3e, 0xb7, 0x5d, 0xe0, 0xb6, 0x5f, 0xff, 0x66, 0xdb, 0x0f,
	0xfa, 0xdc, 0x78, 0xe9, 0x41, 0x5f, 0xeb, 0x74, 0xd5, 0xe3, 0xc6, 0x91, 0x1a, 0xaa, 0xe3, 0x2b,
	0x90, 0xb3, 0xc8, 0x97, 0x67, 0xe9, 0x53, 0x8f, 0x43, 0x17, 0x9d, 0x84, 0x2b, 0x90, 0x7b, 0x42,
	0xc9, 0xa3, 0xf4, 0x59, 0xc3, 0xa1, 0xef, 0x71, 0x31, 0xec, 0x42, 0x9e, 0xc7, 0x0b, 0x03, 0x84,
	0x11, 0x43, 0x2f, 0xe0, 0x22, 0xe4, 0x9a, 0x5d, 0x95, 0x2d, 0x08, 0x04, 0x15, 0x81, 0x6a, 0xbd,
	0xb6, 0xd2, 0x54, 0x50, 0xa6, 0x76, 0x1b, 0x0a, 0x22, 0x08, 0x6c, 0xb1, 0xc4, 0x61, 0x40, 0x2f,
	0x84, 0xcd, 0xd0, 0x86, 0x14, 0x49, 0x4f, 0x8e, 0x0f, 0x14, 0x15, 0x65, 0xd2, 0x53, 0x9d, 0x43,
	0xf9, 0x9a, 0x0f, 0x95, 0x64, 0x21, 0xfe, 0xc3, 0x5c, 0xb2, 0xff, 0x2a, 0x41, 0x39, 0x51, 0x58,
	0xb3, 0x8a, 0x88, 0x58, 0x96, 0xf3, 0x44, 0x23, 0x96, 0x49, 0xfc, 0x30, 0x35, 0x80, 0x43, 0x0d,
	0x86, 0x5c, 0x74, 0xea, 0x7e, 0xa0, 0x25, 0x92, 0x47, 0x85, 0xda, 0x1f, 0x24, 0x40, 0xf3, 0x95,
	0xed, 0x9c, 0x9b, 0xd2, 0x8f, 0xe9, 0x66, 0xed, 0xf7, 0x12, 0x54, 0xd3, 0xe5, 0xec, 0x9c, 0x7b,
	0xd7, 0x7e, 0x54, 0xf7, 0xfe, 0x9e, 0x81, 0xd5, 0x54, 0x11, 0x7b, 0x51, 0xef, 0xbe, 0x80, 0x75,
	0xd3, 0xa0, 0x13, 0xd7, 0x09, 0xa8, 0xad, 0x9f, 0x69, 0x16, 0x7d, 0x4c, 0x2d, 0xb9, 0xc6, 0x37,
	0x8d, 0xdd, 0x6f, 0x2e, 0x93, 0xeb, 0xed, 0x99, 0xde, 0x11, 0x53, 0xdb, 0xdf, 0x68, 0xb7, 0x94,
	0xe3, 0x5e, 0x77, 0xa0, 0x74, 0x9a, 0x9f, 0x69, 0x27, 0x9d, 0x9f, 0x74, 0xba, 0x9f, 0x74, 0x54,
	0x64, 0xce, 0xd1, 0xbe, 0xc7, 0x65, 0xdf, 0x03, 0x34, 0xef, 0x14, 0xbe, 0x0c, 0xcb, 0xdc, 0x42,
	0x2f, 0xe0, 0x0d, 0x58, 0xeb, 0x74, 0xb5, 0x7e, 0xbb, 0xa5, 0x68, 0xca, 0xfd, 0xfb, 0x4a, 0x73,
	0xd0, 0x17, 0x0f, 0x1f, 0x31, 0x7b, 0x90, 0x5a, 0xe0, 0xb5, 0xdf, 0x65, 0x61, 0x63, 0x89, 0x27,
	0xb8, 0x11, 0x5e, 0x59, 0xc4, 0x2d, 0xea, 0x9d, 0x8b, 0x78, 0x5f, 0x67, 0x35, 0x43, 0x8f, 0x78,
	0x41, 0x78, 0xc3, 0xb9, 0x01, 0x2c, 0x4a, 0x76, 0x60, 0x0e, 0x4d, 0xea, 0x85, 0xef, 0x44, 0xe2,
	0x1e, 0xb3, 0x36, 0xc3, 0xc5, 0x53, 0xd1, 0xdb, 0x80, 0x5d, 0xc7, 0x37, 0x03, 0xf3, 0x31, 0xd5,
	0x4c, 0x3b, 0x7a, 0x54, 0x62, 0xf7, 0x9a, 0x9c, 0x8a, 0x22, 0x49, 0xdb, 0x0e, 0x62, 0xb6, 0x4d,
	0x47, 0x64, 0x8e, 0xcd, 0x36, 0xf3, 0xac, 0x8a, 0x22, 0x49, 0xcc, 0xbe, 0x06, 0x15, 0xc3, 0x99,
	0xb2, 0x62, 0x4f, 0xf0, 0xd8, 0xd9, 0x21, 0xa9, 0x65, 0x81, 0xc5, 0x94, 0xb0, 0x8c, 0x9f, 0xbd,
	0x66, 0x55, 0xd4, 0xb2, 0xc0, 0x04, 0xe5, 0x3a, 0xac, 0x91, 0xd1, 0xc8, 0x63, 0xc6, 0x23, 0x43,
	0xe2, 0x62, 0x52, 0x8d, 0x61, 0x4e, 0xdc, 0x7a, 0x00, 0xc5, 0x28, 0x0e, 0xec, 0xa8, 0x66, 0x91,
	0xd0, 0x5c, 0x71, 0xdb, 0xce, 0xec, 0x94, 0xd4, 0xa2, 0x1d, 0x09, 0xaf, 0x41, 0xc5, 0xf4, 0xb5,
	0xd9, 0xe3, 0x7c, 0x66, 0x3b, 0xb3, 0x53, 0x54, 0xcb, 0xa6, 0x1f, 0x3f, 0x6c, 0xd6, 0xbe, 0xca,
	0x40, 0x35, 0xfd, 0x71, 0x01, 0xb7, 0xa0, 0x68, 0x39, 0x3a, 0xe1, 0xa9, 0x25, 0xbe, 0x6c, 0xed,
	0x3c, 0xe7, 0x7b, 0x44, 0xfd, 0x28, 0xe4, 0xab, 0xb1, 0xe6, 0xd6, 0xdf, 0x24, 0x28, 0x46, 0x30,
	0xbe, 0x04, 0x39, 0x97, 0x04, 0x63, 0x6e, 0x2e, 0x7f, 0x90, 0x41, 0x92, 0xca, 0xdb, 0x0c, 0xf7,
	0x5d, 0x62, 0xf3, 0x14, 0x08, 0x71, 0xd6, 0x66, 0xf3, 0x6a, 0x51, 0x62, 0xf0, 0x5b, 0x8f, 0x33,
	0x99, 0x50, 0x3b, 0xf0, 0xa3, 0x79, 0x0d, 0xf1, 0x66, 0x08, 0xe3, 0xb7, 0x60, 0x3d, 0xf0, 0x88,
	0x69, 0xa5, 0xb8, 0x39, 0xce, 0x45, 0x91, 0x20, 0x26, 0xef, 0xc3, 0x95, 0xc8, 0xae, 0x41, 0x03,
	0xa2, 0x8f, 0xa9, 0x31, 0x53, 0x2a, 0xf0, 0xd7, 0x8d, 0xcb, 0x21, 0xa1, 0x15, 0xca, 0x23, 0xdd,
	0xda, 0xd7, 0x12, 0xac, 0x47, 0xf7, 0x34, 0x23, 0x0e, 0xd6, 0x31, 0x00, 0xb1, 0x6d, 0x27, 0x48,
	0x86, 0x6b, 0x31, 0x95, 0x17, 0xf4, 0xea, 0x8d, 0x58, 0x49, 0x4d, 0x18, 0xd8, 0x9a, 0x00, 0xcc,
	0x24, 0xe7, 0x86, 0xed, 0x2a, 0x94, 0xc3, 0x2f, 0x47, 0xfc, 0xf3, 0xa3, 0xb8, 0xd9, 0x83, 0x80,
	0xd8, 0x85, 0x0e, 0x6f, 0x42, 0xfe, 0x94, 0x8e, 0x4c, 0x3b, 0x7c, 0x0f, 0x16, 0x8d, 0xe8, 0xfd,
	0x25, 0x17, 0xbf, 0xbf, 0x1c, 0xfc, 0x5a, 0x82, 0x0d, 0xdd, 0x99, 0xcc, 0xfb, 0x7b, 0x80, 0xe6,
	0x9e, 0x17, 0xfc, 0x8f, 0xa5, 0xcf, 0x3f, 0x1a, 0x99, 0xc1, 0x78, 0x7a, 0x5a, 0xd7, 0x9d, 0xc9,
	0xee, 0xc8, 0xb1, 0x88, 0x3d, 0x9a, 0x7d, 0x3f, 0x7d, 0xbc, 0xb7, 0xcb, 0xaa, 0x1e, 0x3f, 0xf1,
	0x21, 0xf5, 0x5e, 0xa2, 0x54, 0xe5, 0xbc, 0xff, 0x4a, 0xd2, 0x1f, 0x33, 0xd9, 0xc3, 0xde, 0xc1,
	0x9f, 0x32, 0x5b, 0x87, 0xa2, 0xbf, 0x5e, 0x14, 0x1f, 0x95, 0x0e, 0x2d, 0xaa, 0xb3, 0x31, 0xff,
	0x2f, 0x00, 0x00, 0xff, 0xff, 0x9a, 0xd0, 0x4c, 0xbb, 0x9c, 0x1d, 0x00, 0x00,
}

func init() {
	xxx_Descriptor_ProtoFile_FileDesc.Messages = xxx_Descriptor_ProtoFile_MessageDescs[0:21]
	xxx_Descriptor_ProtoFile_MessageDescs[2].Messages = xxx_Descriptor_ProtoFile_MessageDescs[21:23]
	xxx_Descriptor_ProtoFile_MessageDescs[4].Enums = xxx_Descriptor_ProtoFile_EnumDescs[0:2]
	xxx_Descriptor_ProtoFile_MessageDescs[6].Messages = xxx_Descriptor_ProtoFile_MessageDescs[23:24]
	xxx_Descriptor_ProtoFile_MessageDescs[10].Enums = xxx_Descriptor_ProtoFile_EnumDescs[2:3]
	xxx_Descriptor_ProtoFile_MessageDescs[12].Enums = xxx_Descriptor_ProtoFile_EnumDescs[3:5]
	xxx_Descriptor_ProtoFile_MessageDescs[17].Enums = xxx_Descriptor_ProtoFile_EnumDescs[5:6]
	xxx_Descriptor_ProtoFile_MessageDescs[18].Messages = xxx_Descriptor_ProtoFile_MessageDescs[24:25]
	xxx_Descriptor_ProtoFile_MessageDescs[19].Messages = xxx_Descriptor_ProtoFile_MessageDescs[25:26]
	xxx_Descriptor_ProtoFile_MessageDescs[20].Messages = xxx_Descriptor_ProtoFile_MessageDescs[26:27]
	xxx_Descriptor_ProtoFile_MessageDescs[0].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[1].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[5].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[2].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[6].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[6].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[7].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[8].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[8].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[4].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[9].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[10].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[10].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[19].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[4].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[4].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[3].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[2].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[4].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[6].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[5].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[21].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[6].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[5].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[7].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[11].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[8].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[22].Type
	xxx_Descriptor_ProtoFile_MessageDescs[3].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[4].Fields[2].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[1]
	xxx_Descriptor_ProtoFile_MessageDescs[4].Fields[3].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[0]
	xxx_Descriptor_ProtoFile_MessageDescs[4].Fields[9].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[12].Type
	xxx_Descriptor_ProtoFile_MessageDescs[5].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[13].Type
	xxx_Descriptor_ProtoFile_MessageDescs[6].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[7].Type
	xxx_Descriptor_ProtoFile_MessageDescs[6].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[14].Type
	xxx_Descriptor_ProtoFile_MessageDescs[6].Fields[3].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[23].Type
	xxx_Descriptor_ProtoFile_MessageDescs[7].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[15].Type
	xxx_Descriptor_ProtoFile_MessageDescs[8].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[9].Type
	xxx_Descriptor_ProtoFile_MessageDescs[8].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[16].Type
	xxx_Descriptor_ProtoFile_MessageDescs[9].Fields[3].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[17].Type
	xxx_Descriptor_ProtoFile_MessageDescs[10].Fields[5].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[2]
	xxx_Descriptor_ProtoFile_MessageDescs[10].Fields[20].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[11].Fields[4].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[12].Fields[0].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[3]
	xxx_Descriptor_ProtoFile_MessageDescs[12].Fields[2].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[4]
	xxx_Descriptor_ProtoFile_MessageDescs[12].Fields[6].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[13].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[14].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[15].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[16].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[17].Fields[1].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[5]
	xxx_Descriptor_ProtoFile_MessageDescs[17].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[18].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[24].Type
	xxx_Descriptor_ProtoFile_MessageDescs[19].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[25].Type
	xxx_Descriptor_ProtoFile_MessageDescs[20].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[26].Type
	xxx_Descriptor_ProtoFile_MessageDescs[21].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[3].Type
	var err error
	Descriptor_ProtoFile, err = prototype.NewFile(&xxx_Descriptor_ProtoFile_FileDesc)
	if err != nil {
		panic(err)
	}
}

const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)

var Descriptor_ProtoFile protoreflect.FileDescriptor

var xxx_Descriptor_ProtoFile_FileDesc = prototype.File{
	Syntax:  protoreflect.Proto2,
	Path:    "google/protobuf/descriptor.proto",
	Package: "google.protobuf",
}
var xxx_Descriptor_ProtoFile_EnumTypes = [6]protoreflect.EnumType{
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[0].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
			return FieldDescriptorProto_Type(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[1].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
			return FieldDescriptorProto_Label(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[2].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
			return FileOptions_OptimizeMode(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[3].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
			return FieldOptions_CType(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[4].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
			return FieldOptions_JSType(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[5].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
			return MethodOptions_IdempotencyLevel(n)
		},
	),
}
var xxx_Descriptor_ProtoFile_EnumDescs = [6]prototype.Enum{
	{
		Name: "Type",
		Values: []prototype.EnumValue{
			{Name: "TYPE_DOUBLE", Number: 1},
			{Name: "TYPE_FLOAT", Number: 2},
			{Name: "TYPE_INT64", Number: 3},
			{Name: "TYPE_UINT64", Number: 4},
			{Name: "TYPE_INT32", Number: 5},
			{Name: "TYPE_FIXED64", Number: 6},
			{Name: "TYPE_FIXED32", Number: 7},
			{Name: "TYPE_BOOL", Number: 8},
			{Name: "TYPE_STRING", Number: 9},
			{Name: "TYPE_GROUP", Number: 10},
			{Name: "TYPE_MESSAGE", Number: 11},
			{Name: "TYPE_BYTES", Number: 12},
			{Name: "TYPE_UINT32", Number: 13},
			{Name: "TYPE_ENUM", Number: 14},
			{Name: "TYPE_SFIXED32", Number: 15},
			{Name: "TYPE_SFIXED64", Number: 16},
			{Name: "TYPE_SINT32", Number: 17},
			{Name: "TYPE_SINT64", Number: 18},
		},
	},
	{
		Name: "Label",
		Values: []prototype.EnumValue{
			{Name: "LABEL_OPTIONAL", Number: 1},
			{Name: "LABEL_REQUIRED", Number: 2},
			{Name: "LABEL_REPEATED", Number: 3},
		},
	},
	{
		Name: "OptimizeMode",
		Values: []prototype.EnumValue{
			{Name: "SPEED", Number: 1},
			{Name: "CODE_SIZE", Number: 2},
			{Name: "LITE_RUNTIME", Number: 3},
		},
	},
	{
		Name: "CType",
		Values: []prototype.EnumValue{
			{Name: "STRING", Number: 0},
			{Name: "CORD", Number: 1},
			{Name: "STRING_PIECE", Number: 2},
		},
	},
	{
		Name: "JSType",
		Values: []prototype.EnumValue{
			{Name: "JS_NORMAL", Number: 0},
			{Name: "JS_STRING", Number: 1},
			{Name: "JS_NUMBER", Number: 2},
		},
	},
	{
		Name: "IdempotencyLevel",
		Values: []prototype.EnumValue{
			{Name: "IDEMPOTENCY_UNKNOWN", Number: 0},
			{Name: "NO_SIDE_EFFECTS", Number: 1},
			{Name: "IDEMPOTENT", Number: 2},
		},
	},
}
var xxx_Descriptor_ProtoFile_MessageTypes = [27]protoimpl.MessageType{
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[0].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(FileDescriptorSet)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[1].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(FileDescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[2].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(DescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[3].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(ExtensionRangeOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[4].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(FieldDescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[5].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(OneofDescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[6].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(EnumDescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[7].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(EnumValueDescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[8].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(ServiceDescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[9].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(MethodDescriptorProto)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[10].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(FileOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[11].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(MessageOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[12].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(FieldOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[13].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(OneofOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[14].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(EnumOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[15].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(EnumValueOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[16].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(ServiceOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[17].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(MethodOptions)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[18].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(UninterpretedOption)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[19].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(SourceCodeInfo)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[20].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(GeneratedCodeInfo)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[21].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(DescriptorProto_ExtensionRange)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[22].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(DescriptorProto_ReservedRange)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[23].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(EnumDescriptorProto_EnumReservedRange)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[24].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(UninterpretedOption_NamePart)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[25].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(SourceCodeInfo_Location)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[26].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(GeneratedCodeInfo_Annotation)
		},
	)},
}
var xxx_Descriptor_ProtoFile_MessageDescs = [27]prototype.Message{
	{
		Name: "FileDescriptorSet",
		Fields: []prototype.Field{
			{
				Name:        "file",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "file",
			},
		},
	},
	{
		Name: "FileDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "package",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "package",
			},
			{
				Name:        "dependency",
				Number:      3,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "dependency",
			},
			{
				Name:        "public_dependency",
				Number:      10,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "publicDependency",
			},
			{
				Name:        "weak_dependency",
				Number:      11,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "weakDependency",
			},
			{
				Name:        "message_type",
				Number:      4,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "messageType",
			},
			{
				Name:        "enum_type",
				Number:      5,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "enumType",
			},
			{
				Name:        "service",
				Number:      6,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "service",
			},
			{
				Name:        "extension",
				Number:      7,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "extension",
			},
			{
				Name:        "options",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
			{
				Name:        "source_code_info",
				Number:      9,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "sourceCodeInfo",
			},
			{
				Name:        "syntax",
				Number:      12,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "syntax",
			},
		},
	},
	{
		Name: "DescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "field",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "field",
			},
			{
				Name:        "extension",
				Number:      6,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "extension",
			},
			{
				Name:        "nested_type",
				Number:      3,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "nestedType",
			},
			{
				Name:        "enum_type",
				Number:      4,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "enumType",
			},
			{
				Name:        "extension_range",
				Number:      5,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "extensionRange",
			},
			{
				Name:        "oneof_decl",
				Number:      8,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "oneofDecl",
			},
			{
				Name:        "options",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
			{
				Name:        "reserved_range",
				Number:      9,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "reservedRange",
			},
			{
				Name:        "reserved_name",
				Number:      10,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "reservedName",
			},
		},
	},
	{
		Name: "ExtensionRangeOptions",
		Fields: []prototype.Field{
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "FieldDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "number",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "number",
			},
			{
				Name:        "label",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "label",
			},
			{
				Name:        "type",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "type",
			},
			{
				Name:        "type_name",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "typeName",
			},
			{
				Name:        "extendee",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "extendee",
			},
			{
				Name:        "default_value",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "defaultValue",
			},
			{
				Name:        "oneof_index",
				Number:      9,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "oneofIndex",
			},
			{
				Name:        "json_name",
				Number:      10,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "jsonName",
			},
			{
				Name:        "options",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
		},
	},
	{
		Name: "OneofDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "options",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
		},
	},
	{
		Name: "EnumDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "value",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "value",
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
			{
				Name:        "reserved_range",
				Number:      4,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "reservedRange",
			},
			{
				Name:        "reserved_name",
				Number:      5,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "reservedName",
			},
		},
	},
	{
		Name: "EnumValueDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "number",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "number",
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
		},
	},
	{
		Name: "ServiceDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "method",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "method",
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
		},
	},
	{
		Name: "MethodDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
			},
			{
				Name:        "input_type",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "inputType",
			},
			{
				Name:        "output_type",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "outputType",
			},
			{
				Name:        "options",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
			{
				Name:        "client_streaming",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "clientStreaming",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "server_streaming",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "serverStreaming",
				Default:     protoreflect.ValueOf(bool(false)),
			},
		},
	},
	{
		Name: "FileOptions",
		Fields: []prototype.Field{
			{
				Name:        "java_package",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "javaPackage",
			},
			{
				Name:        "java_outer_classname",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "javaOuterClassname",
			},
			{
				Name:        "java_multiple_files",
				Number:      10,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaMultipleFiles",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "java_generate_equals_and_hash",
				Number:      20,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaGenerateEqualsAndHash",
			},
			{
				Name:        "java_string_check_utf8",
				Number:      27,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaStringCheckUtf8",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "optimize_for",
				Number:      9,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "optimizeFor",
				Default:     protoreflect.ValueOf(string("SPEED")),
			},
			{
				Name:        "go_package",
				Number:      11,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "goPackage",
			},
			{
				Name:        "cc_generic_services",
				Number:      16,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "ccGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "java_generic_services",
				Number:      17,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "py_generic_services",
				Number:      18,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "pyGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "php_generic_services",
				Number:      42,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "phpGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "deprecated",
				Number:      23,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "cc_enable_arenas",
				Number:      31,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "ccEnableArenas",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "objc_class_prefix",
				Number:      36,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "objcClassPrefix",
			},
			{
				Name:        "csharp_namespace",
				Number:      37,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "csharpNamespace",
			},
			{
				Name:        "swift_prefix",
				Number:      39,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "swiftPrefix",
			},
			{
				Name:        "php_class_prefix",
				Number:      40,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "phpClassPrefix",
			},
			{
				Name:        "php_namespace",
				Number:      41,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "phpNamespace",
			},
			{
				Name:        "php_metadata_namespace",
				Number:      44,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "phpMetadataNamespace",
			},
			{
				Name:        "ruby_package",
				Number:      45,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "rubyPackage",
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "MessageOptions",
		Fields: []prototype.Field{
			{
				Name:        "message_set_wire_format",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "messageSetWireFormat",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "no_standard_descriptor_accessor",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "noStandardDescriptorAccessor",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "deprecated",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "map_entry",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "mapEntry",
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "FieldOptions",
		Fields: []prototype.Field{
			{
				Name:        "ctype",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "ctype",
				Default:     protoreflect.ValueOf(string("STRING")),
			},
			{
				Name:        "packed",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "packed",
			},
			{
				Name:        "jstype",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "jstype",
				Default:     protoreflect.ValueOf(string("JS_NORMAL")),
			},
			{
				Name:        "lazy",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "lazy",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "deprecated",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "weak",
				Number:      10,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "weak",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "OneofOptions",
		Fields: []prototype.Field{
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "EnumOptions",
		Fields: []prototype.Field{
			{
				Name:        "allow_alias",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "allowAlias",
			},
			{
				Name:        "deprecated",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "EnumValueOptions",
		Fields: []prototype.Field{
			{
				Name:        "deprecated",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "ServiceOptions",
		Fields: []prototype.Field{
			{
				Name:        "deprecated",
				Number:      33,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "MethodOptions",
		Fields: []prototype.Field{
			{
				Name:        "deprecated",
				Number:      33,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
			},
			{
				Name:        "idempotency_level",
				Number:      34,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "idempotencyLevel",
				Default:     protoreflect.ValueOf(string("IDEMPOTENCY_UNKNOWN")),
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "UninterpretedOption",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "name",
			},
			{
				Name:        "identifier_value",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "identifierValue",
			},
			{
				Name:        "positive_int_value",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Uint64Kind,
				JSONName:    "positiveIntValue",
			},
			{
				Name:        "negative_int_value",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int64Kind,
				JSONName:    "negativeIntValue",
			},
			{
				Name:        "double_value",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.DoubleKind,
				JSONName:    "doubleValue",
			},
			{
				Name:        "string_value",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BytesKind,
				JSONName:    "stringValue",
			},
			{
				Name:        "aggregate_value",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "aggregateValue",
			},
		},
	},
	{
		Name: "SourceCodeInfo",
		Fields: []prototype.Field{
			{
				Name:        "location",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "location",
			},
		},
	},
	{
		Name: "GeneratedCodeInfo",
		Fields: []prototype.Field{
			{
				Name:        "annotation",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "annotation",
			},
		},
	},
	{
		Name: "ExtensionRange",
		Fields: []prototype.Field{
			{
				Name:        "start",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "start",
			},
			{
				Name:        "end",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
			},
		},
	},
	{
		Name: "ReservedRange",
		Fields: []prototype.Field{
			{
				Name:        "start",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "start",
			},
			{
				Name:        "end",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
			},
		},
	},
	{
		Name: "EnumReservedRange",
		Fields: []prototype.Field{
			{
				Name:        "start",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "start",
			},
			{
				Name:        "end",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
			},
		},
	},
	{
		Name: "NamePart",
		Fields: []prototype.Field{
			{
				Name:        "name_part",
				Number:      1,
				Cardinality: protoreflect.Required,
				Kind:        protoreflect.StringKind,
				JSONName:    "namePart",
			},
			{
				Name:        "is_extension",
				Number:      2,
				Cardinality: protoreflect.Required,
				Kind:        protoreflect.BoolKind,
				JSONName:    "isExtension",
			},
		},
	},
	{
		Name: "Location",
		Fields: []prototype.Field{
			{
				Name:        "path",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "path",
			},
			{
				Name:        "span",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "span",
			},
			{
				Name:        "leading_comments",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "leadingComments",
			},
			{
				Name:        "trailing_comments",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "trailingComments",
			},
			{
				Name:        "leading_detached_comments",
				Number:      6,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "leadingDetachedComments",
			},
		},
	},
	{
		Name: "Annotation",
		Fields: []prototype.Field{
			{
				Name:        "path",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "path",
			},
			{
				Name:        "source_file",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "sourceFile",
			},
			{
				Name:        "begin",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "begin",
			},
			{
				Name:        "end",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
			},
		},
	},
}
