// Code generated by protoc-gen-go. DO NOT EDIT.
// source: extensions/ext/ext.proto

package ext

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	base "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/extensions/base"
	extra "github.com/golang/protobuf/v2/cmd/protoc-gen-go/testdata/extensions/extra"
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	prototype "github.com/golang/protobuf/v2/reflect/prototype"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type Enum int32

const (
	Enum_ZERO Enum = 0
)

type xxx_Enum Enum

func (e Enum) ProtoReflect() protoreflect.Enum {
	return (xxx_Enum)(e)
}
func (e xxx_Enum) Type() protoreflect.EnumType {
	return xxx_Ext_ProtoFile_EnumTypes[0]
}
func (e xxx_Enum) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var Enum_name = map[int32]string{
	0: "ZERO",
}

var Enum_value = map[string]int32{
	"ZERO": 0,
}

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

func (x Enum) String() string {
	return proto.EnumName(Enum_name, int32(x))
}

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

func (Enum) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{0}
}

type Message struct {
	Data                 []byte   `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_Message struct{ m *Message }

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

func (m *Message) Reset()         { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage()    {}
func (*Message) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{0}
}

func (m *Message) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Message.Unmarshal(m, b)
}
func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Message.Marshal(b, m, deterministic)
}
func (m *Message) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Message.Merge(m, src)
}
func (m *Message) XXX_Size() int {
	return xxx_messageInfo_Message.Size(m)
}
func (m *Message) XXX_DiscardUnknown() {
	xxx_messageInfo_Message.DiscardUnknown(m)
}

var xxx_messageInfo_Message proto.InternalMessageInfo

func (m *Message) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

type Message_M struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_Message_M struct{ m *Message_M }

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

func (m *Message_M) Reset()         { *m = Message_M{} }
func (m *Message_M) String() string { return proto.CompactTextString(m) }
func (*Message_M) ProtoMessage()    {}
func (*Message_M) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{0, 0}
}

func (m *Message_M) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Message_M.Unmarshal(m, b)
}
func (m *Message_M) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Message_M.Marshal(b, m, deterministic)
}
func (m *Message_M) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Message_M.Merge(m, src)
}
func (m *Message_M) XXX_Size() int {
	return xxx_messageInfo_Message_M.Size(m)
}
func (m *Message_M) XXX_DiscardUnknown() {
	xxx_messageInfo_Message_M.DiscardUnknown(m)
}

var xxx_messageInfo_Message_M proto.InternalMessageInfo

type ExtensionGroup struct {
	ExtensionGroup       *string  `protobuf:"bytes,120,opt,name=extension_group,json=extensionGroup" json:"extension_group,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_ExtensionGroup struct{ m *ExtensionGroup }

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

func (m *ExtensionGroup) Reset()         { *m = ExtensionGroup{} }
func (m *ExtensionGroup) String() string { return proto.CompactTextString(m) }
func (*ExtensionGroup) ProtoMessage()    {}
func (*ExtensionGroup) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{1}
}

func (m *ExtensionGroup) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExtensionGroup.Unmarshal(m, b)
}
func (m *ExtensionGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExtensionGroup.Marshal(b, m, deterministic)
}
func (m *ExtensionGroup) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExtensionGroup.Merge(m, src)
}
func (m *ExtensionGroup) XXX_Size() int {
	return xxx_messageInfo_ExtensionGroup.Size(m)
}
func (m *ExtensionGroup) XXX_DiscardUnknown() {
	xxx_messageInfo_ExtensionGroup.DiscardUnknown(m)
}

var xxx_messageInfo_ExtensionGroup proto.InternalMessageInfo

func (m *ExtensionGroup) GetExtensionGroup() string {
	if m != nil && m.ExtensionGroup != nil {
		return *m.ExtensionGroup
	}
	return ""
}

// Extend in the scope of another type.
type ExtendingMessage struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_ExtendingMessage struct{ m *ExtendingMessage }

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

func (m *ExtendingMessage) Reset()         { *m = ExtendingMessage{} }
func (m *ExtendingMessage) String() string { return proto.CompactTextString(m) }
func (*ExtendingMessage) ProtoMessage()    {}
func (*ExtendingMessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{2}
}

func (m *ExtendingMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExtendingMessage.Unmarshal(m, b)
}
func (m *ExtendingMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExtendingMessage.Marshal(b, m, deterministic)
}
func (m *ExtendingMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExtendingMessage.Merge(m, src)
}
func (m *ExtendingMessage) XXX_Size() int {
	return xxx_messageInfo_ExtendingMessage.Size(m)
}
func (m *ExtendingMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_ExtendingMessage.DiscardUnknown(m)
}

var xxx_messageInfo_ExtendingMessage proto.InternalMessageInfo

var E_ExtendingMessage_ExtendingMessageString = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*string)(nil),
	Field:         200,
	Name:          "goproto.protoc.extension.ext.ExtendingMessage.extending_message_string",
	Tag:           "bytes,200,opt,name=extending_message_string",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtendingMessage_ExtendingMessageSubmessage = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*ExtendingMessage_ExtendingMessageSubmessage)(nil),
	Field:         201,
	Name:          "goproto.protoc.extension.ext.ExtendingMessage.extending_message_submessage",
	Tag:           "bytes,201,opt,name=extending_message_submessage",
	Filename:      "extensions/ext/ext.proto",
}

type ExtendingMessage_ExtendingMessageSubmessage struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_ExtendingMessage_ExtendingMessageSubmessage struct {
	m *ExtendingMessage_ExtendingMessageSubmessage
}

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

func (m *ExtendingMessage_ExtendingMessageSubmessage) Reset() {
	*m = ExtendingMessage_ExtendingMessageSubmessage{}
}
func (m *ExtendingMessage_ExtendingMessageSubmessage) String() string {
	return proto.CompactTextString(m)
}
func (*ExtendingMessage_ExtendingMessageSubmessage) ProtoMessage() {}
func (*ExtendingMessage_ExtendingMessageSubmessage) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{2, 0}
}

func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Unmarshal(m, b)
}
func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Marshal(b, m, deterministic)
}
func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Merge(m, src)
}
func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Size() int {
	return xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.Size(m)
}
func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_DiscardUnknown() {
	xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage.DiscardUnknown(m)
}

var xxx_messageInfo_ExtendingMessage_ExtendingMessageSubmessage proto.InternalMessageInfo

type RepeatedGroup struct {
	RepeatedXGroup       []string `protobuf:"bytes,319,rep,name=repeated_x_group,json=repeatedXGroup" json:"repeated_x_group,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_RepeatedGroup struct{ m *RepeatedGroup }

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

func (m *RepeatedGroup) Reset()         { *m = RepeatedGroup{} }
func (m *RepeatedGroup) String() string { return proto.CompactTextString(m) }
func (*RepeatedGroup) ProtoMessage()    {}
func (*RepeatedGroup) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{3}
}

func (m *RepeatedGroup) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RepeatedGroup.Unmarshal(m, b)
}
func (m *RepeatedGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RepeatedGroup.Marshal(b, m, deterministic)
}
func (m *RepeatedGroup) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RepeatedGroup.Merge(m, src)
}
func (m *RepeatedGroup) XXX_Size() int {
	return xxx_messageInfo_RepeatedGroup.Size(m)
}
func (m *RepeatedGroup) XXX_DiscardUnknown() {
	xxx_messageInfo_RepeatedGroup.DiscardUnknown(m)
}

var xxx_messageInfo_RepeatedGroup proto.InternalMessageInfo

func (m *RepeatedGroup) GetRepeatedXGroup() []string {
	if m != nil {
		return m.RepeatedXGroup
	}
	return nil
}

// An extension of an extension.
type Extendable struct {
	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
	proto.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized             []byte `json:"-"`
	XXX_sizecache                int32  `json:"-"`
}

type xxx_Extendable struct{ m *Extendable }

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

func (m *Extendable) Reset()         { *m = Extendable{} }
func (m *Extendable) String() string { return proto.CompactTextString(m) }
func (*Extendable) ProtoMessage()    {}
func (*Extendable) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{4}
}

var extRange_Extendable = []proto.ExtensionRange{
	{Start: 1, End: 536870911},
}

func (*Extendable) ExtensionRangeArray() []proto.ExtensionRange {
	return extRange_Extendable
}

func (m *Extendable) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Extendable.Unmarshal(m, b)
}
func (m *Extendable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Extendable.Marshal(b, m, deterministic)
}
func (m *Extendable) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Extendable.Merge(m, src)
}
func (m *Extendable) XXX_Size() int {
	return xxx_messageInfo_Extendable.Size(m)
}
func (m *Extendable) XXX_DiscardUnknown() {
	xxx_messageInfo_Extendable.DiscardUnknown(m)
}

var xxx_messageInfo_Extendable proto.InternalMessageInfo

// Message set wire format.
type MessageSetWireFormatExtension struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_MessageSetWireFormatExtension struct {
	m *MessageSetWireFormatExtension
}

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

func (m *MessageSetWireFormatExtension) Reset()         { *m = MessageSetWireFormatExtension{} }
func (m *MessageSetWireFormatExtension) String() string { return proto.CompactTextString(m) }
func (*MessageSetWireFormatExtension) ProtoMessage()    {}
func (*MessageSetWireFormatExtension) Descriptor() ([]byte, []int) {
	return fileDescriptor_bf470ef4907b23cb, []int{5}
}

func (m *MessageSetWireFormatExtension) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MessageSetWireFormatExtension.Unmarshal(m, b)
}
func (m *MessageSetWireFormatExtension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MessageSetWireFormatExtension.Marshal(b, m, deterministic)
}
func (m *MessageSetWireFormatExtension) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MessageSetWireFormatExtension.Merge(m, src)
}
func (m *MessageSetWireFormatExtension) XXX_Size() int {
	return xxx_messageInfo_MessageSetWireFormatExtension.Size(m)
}
func (m *MessageSetWireFormatExtension) XXX_DiscardUnknown() {
	xxx_messageInfo_MessageSetWireFormatExtension.DiscardUnknown(m)
}

var xxx_messageInfo_MessageSetWireFormatExtension proto.InternalMessageInfo

var E_MessageSetWireFormatExtension_MessageSetExtension = &proto.ExtensionDesc{
	ExtendedType:  (*base.MessageSetWireFormatMessage)(nil),
	ExtensionType: (*MessageSetWireFormatExtension)(nil),
	Field:         100,
	Name:          "goproto.protoc.extension.ext.MessageSetWireFormatExtension",
	Tag:           "bytes,100,opt,name=message_set_extension",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionBool = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*bool)(nil),
	Field:         101,
	Name:          "goproto.protoc.extension.ext.extension_bool",
	Tag:           "varint,101,opt,name=extension_bool",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionEnum = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*Enum)(nil),
	Field:         102,
	Name:          "goproto.protoc.extension.ext.extension_enum",
	Tag:           "varint,102,opt,name=extension_enum,enum=goproto.protoc.extension.ext.Enum",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionInt32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*int32)(nil),
	Field:         103,
	Name:          "goproto.protoc.extension.ext.extension_int32",
	Tag:           "varint,103,opt,name=extension_int32",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionSint32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*int32)(nil),
	Field:         104,
	Name:          "goproto.protoc.extension.ext.extension_sint32",
	Tag:           "zigzag32,104,opt,name=extension_sint32",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionUint32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*uint32)(nil),
	Field:         105,
	Name:          "goproto.protoc.extension.ext.extension_uint32",
	Tag:           "varint,105,opt,name=extension_uint32",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionInt64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*int64)(nil),
	Field:         106,
	Name:          "goproto.protoc.extension.ext.extension_int64",
	Tag:           "varint,106,opt,name=extension_int64",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionSint64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*int64)(nil),
	Field:         107,
	Name:          "goproto.protoc.extension.ext.extension_sint64",
	Tag:           "zigzag64,107,opt,name=extension_sint64",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionUint64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*uint64)(nil),
	Field:         108,
	Name:          "goproto.protoc.extension.ext.extension_uint64",
	Tag:           "varint,108,opt,name=extension_uint64",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionSfixed32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*int32)(nil),
	Field:         109,
	Name:          "goproto.protoc.extension.ext.extension_sfixed32",
	Tag:           "fixed32,109,opt,name=extension_sfixed32",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionFixed32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*uint32)(nil),
	Field:         110,
	Name:          "goproto.protoc.extension.ext.extension_fixed32",
	Tag:           "fixed32,110,opt,name=extension_fixed32",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionFloat = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*float32)(nil),
	Field:         111,
	Name:          "goproto.protoc.extension.ext.extension_float",
	Tag:           "fixed32,111,opt,name=extension_float",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionSfixed64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*int64)(nil),
	Field:         112,
	Name:          "goproto.protoc.extension.ext.extension_sfixed64",
	Tag:           "fixed64,112,opt,name=extension_sfixed64",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionFixed64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*uint64)(nil),
	Field:         113,
	Name:          "goproto.protoc.extension.ext.extension_fixed64",
	Tag:           "fixed64,113,opt,name=extension_fixed64",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionDouble = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*float64)(nil),
	Field:         114,
	Name:          "goproto.protoc.extension.ext.extension_double",
	Tag:           "fixed64,114,opt,name=extension_double",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionString = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*string)(nil),
	Field:         115,
	Name:          "goproto.protoc.extension.ext.extension_string",
	Tag:           "bytes,115,opt,name=extension_string",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtensionBytes = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]byte)(nil),
	Field:         116,
	Name:          "goproto.protoc.extension.ext.extension_bytes",
	Tag:           "bytes,116,opt,name=extension_bytes",
	Filename:      "extensions/ext/ext.proto",
}

var E_Extension_Message = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*Message)(nil),
	Field:         117,
	Name:          "goproto.protoc.extension.ext.extension_Message",
	Tag:           "bytes,117,opt,name=extension_Message",
	Filename:      "extensions/ext/ext.proto",
}

var E_Extension_MessageM = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*Message_M)(nil),
	Field:         118,
	Name:          "goproto.protoc.extension.ext.extension_MessageM",
	Tag:           "bytes,118,opt,name=extension_MessageM",
	Filename:      "extensions/ext/ext.proto",
}

var E_Extensiongroup = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*ExtensionGroup)(nil),
	Field:         119,
	Name:          "goproto.protoc.extension.ext.extensiongroup",
	Tag:           "group,119,opt,name=ExtensionGroup",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtraMessage = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*extra.ExtraMessage)(nil),
	Field:         9,
	Name:          "goproto.protoc.extension.ext.extra_message",
	Tag:           "bytes,9,opt,name=extra_message",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXBool = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]bool)(nil),
	Field:         301,
	Name:          "goproto.protoc.extension.ext.repeated_x_bool",
	Tag:           "varint,301,rep,name=repeated_x_bool",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXEnum = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]Enum)(nil),
	Field:         302,
	Name:          "goproto.protoc.extension.ext.repeated_x_enum",
	Tag:           "varint,302,rep,name=repeated_x_enum,enum=goproto.protoc.extension.ext.Enum",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXInt32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]int32)(nil),
	Field:         303,
	Name:          "goproto.protoc.extension.ext.repeated_x_int32",
	Tag:           "varint,303,rep,name=repeated_x_int32",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXSint32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]int32)(nil),
	Field:         304,
	Name:          "goproto.protoc.extension.ext.repeated_x_sint32",
	Tag:           "zigzag32,304,rep,name=repeated_x_sint32",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXUint32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]uint32)(nil),
	Field:         305,
	Name:          "goproto.protoc.extension.ext.repeated_x_uint32",
	Tag:           "varint,305,rep,name=repeated_x_uint32",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXInt64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]int64)(nil),
	Field:         306,
	Name:          "goproto.protoc.extension.ext.repeated_x_int64",
	Tag:           "varint,306,rep,name=repeated_x_int64",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXSint64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]int64)(nil),
	Field:         307,
	Name:          "goproto.protoc.extension.ext.repeated_x_sint64",
	Tag:           "zigzag64,307,rep,name=repeated_x_sint64",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXUint64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]uint64)(nil),
	Field:         308,
	Name:          "goproto.protoc.extension.ext.repeated_x_uint64",
	Tag:           "varint,308,rep,name=repeated_x_uint64",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXSfixed32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]int32)(nil),
	Field:         309,
	Name:          "goproto.protoc.extension.ext.repeated_x_sfixed32",
	Tag:           "fixed32,309,rep,name=repeated_x_sfixed32",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXFixed32 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]uint32)(nil),
	Field:         310,
	Name:          "goproto.protoc.extension.ext.repeated_x_fixed32",
	Tag:           "fixed32,310,rep,name=repeated_x_fixed32",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXFloat = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]float32)(nil),
	Field:         311,
	Name:          "goproto.protoc.extension.ext.repeated_x_float",
	Tag:           "fixed32,311,rep,name=repeated_x_float",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXSfixed64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]int64)(nil),
	Field:         312,
	Name:          "goproto.protoc.extension.ext.repeated_x_sfixed64",
	Tag:           "fixed64,312,rep,name=repeated_x_sfixed64",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXFixed64 = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]uint64)(nil),
	Field:         313,
	Name:          "goproto.protoc.extension.ext.repeated_x_fixed64",
	Tag:           "fixed64,313,rep,name=repeated_x_fixed64",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXDouble = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]float64)(nil),
	Field:         314,
	Name:          "goproto.protoc.extension.ext.repeated_x_double",
	Tag:           "fixed64,314,rep,name=repeated_x_double",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXString = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]string)(nil),
	Field:         315,
	Name:          "goproto.protoc.extension.ext.repeated_x_string",
	Tag:           "bytes,315,rep,name=repeated_x_string",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedXBytes = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([][]byte)(nil),
	Field:         316,
	Name:          "goproto.protoc.extension.ext.repeated_x_bytes",
	Tag:           "bytes,316,rep,name=repeated_x_bytes",
	Filename:      "extensions/ext/ext.proto",
}

var E_RepeatedX_Message = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]*Message)(nil),
	Field:         317,
	Name:          "goproto.protoc.extension.ext.repeated_x_Message",
	Tag:           "bytes,317,rep,name=repeated_x_Message",
	Filename:      "extensions/ext/ext.proto",
}

var E_Repeatedgroup = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: ([]*RepeatedGroup)(nil),
	Field:         318,
	Name:          "goproto.protoc.extension.ext.repeatedgroup",
	Tag:           "group,318,rep,name=RepeatedGroup",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtendableField = &proto.ExtensionDesc{
	ExtendedType:  (*base.BaseMessage)(nil),
	ExtensionType: (*Extendable)(nil),
	Field:         400,
	Name:          "goproto.protoc.extension.ext.extendable_field",
	Tag:           "bytes,400,opt,name=extendable_field",
	Filename:      "extensions/ext/ext.proto",
}

var E_ExtendableStringField = &proto.ExtensionDesc{
	ExtendedType:  (*Extendable)(nil),
	ExtensionType: (*string)(nil),
	Field:         1,
	Name:          "goproto.protoc.extension.ext.extendable_string_field",
	Tag:           "bytes,1,opt,name=extendable_string_field",
	Filename:      "extensions/ext/ext.proto",
}

var E_MessageSetExtension = &proto.ExtensionDesc{
	ExtendedType:  (*base.MessageSetWireFormatMessage)(nil),
	ExtensionType: (*MessageSetWireFormatExtension)(nil),
	Field:         101,
	Name:          "goproto.protoc.extension.ext.",
	Tag:           "bytes,101,opt,name=message_set_extension",
	Filename:      "extensions/ext/ext.proto",
}

func init() {
	proto.RegisterEnum("goproto.protoc.extension.ext.Enum", Enum_name, Enum_value)
	proto.RegisterType((*Message)(nil), "goproto.protoc.extension.ext.Message")
	proto.RegisterType((*Message_M)(nil), "goproto.protoc.extension.ext.Message.M")
	proto.RegisterType((*ExtensionGroup)(nil), "goproto.protoc.extension.ext.ExtensionGroup")
	proto.RegisterExtension(E_ExtendingMessage_ExtendingMessageString)
	proto.RegisterExtension(E_ExtendingMessage_ExtendingMessageSubmessage)
	proto.RegisterType((*ExtendingMessage)(nil), "goproto.protoc.extension.ext.ExtendingMessage")
	proto.RegisterType((*ExtendingMessage_ExtendingMessageSubmessage)(nil), "goproto.protoc.extension.ext.ExtendingMessage.ExtendingMessageSubmessage")
	proto.RegisterType((*RepeatedGroup)(nil), "goproto.protoc.extension.ext.RepeatedGroup")
	proto.RegisterType((*Extendable)(nil), "goproto.protoc.extension.ext.Extendable")
	proto.RegisterExtension(E_MessageSetWireFormatExtension_MessageSetExtension)
	proto.RegisterType((*MessageSetWireFormatExtension)(nil), "goproto.protoc.extension.ext.MessageSetWireFormatExtension")
	proto.RegisterExtension(E_ExtensionBool)
	proto.RegisterExtension(E_ExtensionEnum)
	proto.RegisterExtension(E_ExtensionInt32)
	proto.RegisterExtension(E_ExtensionSint32)
	proto.RegisterExtension(E_ExtensionUint32)
	proto.RegisterExtension(E_ExtensionInt64)
	proto.RegisterExtension(E_ExtensionSint64)
	proto.RegisterExtension(E_ExtensionUint64)
	proto.RegisterExtension(E_ExtensionSfixed32)
	proto.RegisterExtension(E_ExtensionFixed32)
	proto.RegisterExtension(E_ExtensionFloat)
	proto.RegisterExtension(E_ExtensionSfixed64)
	proto.RegisterExtension(E_ExtensionFixed64)
	proto.RegisterExtension(E_ExtensionDouble)
	proto.RegisterExtension(E_ExtensionString)
	proto.RegisterExtension(E_ExtensionBytes)
	proto.RegisterExtension(E_Extension_Message)
	proto.RegisterExtension(E_Extension_MessageM)
	proto.RegisterExtension(E_Extensiongroup)
	proto.RegisterExtension(E_ExtraMessage)
	proto.RegisterExtension(E_RepeatedXBool)
	proto.RegisterExtension(E_RepeatedXEnum)
	proto.RegisterExtension(E_RepeatedXInt32)
	proto.RegisterExtension(E_RepeatedXSint32)
	proto.RegisterExtension(E_RepeatedXUint32)
	proto.RegisterExtension(E_RepeatedXInt64)
	proto.RegisterExtension(E_RepeatedXSint64)
	proto.RegisterExtension(E_RepeatedXUint64)
	proto.RegisterExtension(E_RepeatedXSfixed32)
	proto.RegisterExtension(E_RepeatedXFixed32)
	proto.RegisterExtension(E_RepeatedXFloat)
	proto.RegisterExtension(E_RepeatedXSfixed64)
	proto.RegisterExtension(E_RepeatedXFixed64)
	proto.RegisterExtension(E_RepeatedXDouble)
	proto.RegisterExtension(E_RepeatedXString)
	proto.RegisterExtension(E_RepeatedXBytes)
	proto.RegisterExtension(E_RepeatedX_Message)
	proto.RegisterExtension(E_Repeatedgroup)
	proto.RegisterExtension(E_ExtendableField)
	proto.RegisterExtension(E_ExtendableStringField)
	proto.RegisterExtension(E_MessageSetExtension)
}

func init() { proto.RegisterFile("extensions/ext/ext.proto", fileDescriptor_bf470ef4907b23cb) }

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

func init() {
	xxx_Ext_ProtoFile_FileDesc.Enums = xxx_Ext_ProtoFile_EnumDescs[0:1]
	xxx_Ext_ProtoFile_FileDesc.Messages = xxx_Ext_ProtoFile_MessageDescs[0:6]
	xxx_Ext_ProtoFile_MessageDescs[0].Messages = xxx_Ext_ProtoFile_MessageDescs[6:7]
	xxx_Ext_ProtoFile_MessageDescs[2].Messages = xxx_Ext_ProtoFile_MessageDescs[7:8]
	var err error
	Ext_ProtoFile, err = prototype.NewFile(&xxx_Ext_ProtoFile_FileDesc)
	if err != nil {
		panic(err)
	}
}

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

var Ext_ProtoFile protoreflect.FileDescriptor

var xxx_Ext_ProtoFile_FileDesc = prototype.File{
	Syntax:  protoreflect.Proto2,
	Path:    "extensions/ext/ext.proto",
	Package: "goproto.protoc.extension.ext",
	Imports: []protoreflect.FileImport{
		{FileDescriptor: prototype.PlaceholderFile("extensions/base/base.proto", "goproto.protoc.extension.base")},
		{FileDescriptor: prototype.PlaceholderFile("extensions/extra/extra.proto", "goproto.protoc.extension.extra")},
	},
}
var xxx_Ext_ProtoFile_EnumTypes = [1]protoreflect.EnumType{
	prototype.GoEnum(
		xxx_Ext_ProtoFile_EnumDescs[0].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.ProtoEnum {
			return Enum(n)
		},
	),
}
var xxx_Ext_ProtoFile_EnumDescs = [1]prototype.Enum{
	{
		Name: "Enum",
		Values: []prototype.EnumValue{
			{Name: "ZERO", Number: 0},
		},
	},
}
var xxx_Ext_ProtoFile_MessageTypes = [8]protoimpl.MessageType{
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[0].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(Message)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[1].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(ExtensionGroup)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[2].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(ExtendingMessage)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[3].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(RepeatedGroup)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[4].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(Extendable)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[5].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(MessageSetWireFormatExtension)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[6].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(Message_M)
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Ext_ProtoFile_MessageDescs[7].Reference(),
		func(protoreflect.MessageType) protoreflect.ProtoMessage {
			return new(ExtendingMessage_ExtendingMessageSubmessage)
		},
	)},
}
var xxx_Ext_ProtoFile_MessageDescs = [8]prototype.Message{
	{
		Name: "Message",
		Fields: []prototype.Field{
			{
				Name:        "data",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BytesKind,
				JSONName:    "data",
			},
		},
	},
	{
		Name: "ExtensionGroup",
		Fields: []prototype.Field{
			{
				Name:        "extension_group",
				Number:      120,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "extensionGroup",
			},
		},
	},
	{
		Name: "ExtendingMessage",
	},
	{
		Name: "RepeatedGroup",
		Fields: []prototype.Field{
			{
				Name:        "repeated_x_group",
				Number:      319,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "repeatedXGroup",
			},
		},
	},
	{
		Name:            "Extendable",
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1, 536870912}},
	},
	{
		Name: "MessageSetWireFormatExtension",
	},
	{
		Name: "M",
	},
	{
		Name: "ExtendingMessageSubmessage",
	},
}
