// Code generated by protoc-gen-go. DO NOT EDIT.
// source: import_public/sub2/a.proto

package sub2

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

// 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 Sub2Message struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_Sub2Message struct{ m *Sub2Message }

func (m *Sub2Message) ProtoReflect() protoreflect.Message {
	return xxx_Sub2Message{m}
}
func (m xxx_Sub2Message) Type() protoreflect.MessageType {
	return xxx_A_ProtoFile_MessageTypes[0].Type
}
func (m xxx_Sub2Message) KnownFields() protoreflect.KnownFields {
	return xxx_A_ProtoFile_MessageTypes[0].KnownFieldsOf(m.m)
}
func (m xxx_Sub2Message) UnknownFields() protoreflect.UnknownFields {
	return xxx_A_ProtoFile_MessageTypes[0].UnknownFieldsOf(m.m)
}
func (m xxx_Sub2Message) Interface() protoreflect.ProtoMessage {
	return m.m
}

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

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

var xxx_messageInfo_Sub2Message proto.InternalMessageInfo

func init() {
	proto.RegisterFile("import_public/sub2/a.proto", fileDescriptor_7ac53d99328778ac)
	proto.RegisterType((*Sub2Message)(nil), "goproto.protoc.import_public.sub2.Sub2Message")
}

var fileDescriptor_7ac53d99328778ac = []byte{
	// 137 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x8e, 0x31, 0x0b, 0xc2, 0x40,
	0x0c, 0x46, 0xf7, 0x8a, 0x8b, 0xa3, 0x9b, 0xee, 0xbd, 0xc0, 0xfd, 0x04, 0x57, 0xe9, 0xe4, 0xe6,
	0x22, 0x49, 0x7a, 0xc6, 0x83, 0x5e, 0x73, 0xf4, 0x12, 0x7f, 0xbf, 0xd8, 0x4e, 0xe2, 0xf6, 0x3d,
	0x78, 0x1f, 0xbc, 0xee, 0x98, 0x4b, 0xd5, 0xc5, 0x1e, 0xd5, 0x69, 0xca, 0x0c, 0xcd, 0x29, 0x02,
	0x86, 0xba, 0xa8, 0xe9, 0xe1, 0x24, 0xba, 0x8e, 0x0d, 0x39, 0xfc, 0xa8, 0xe1, 0xab, 0x9e, 0xf7,
	0xdd, 0xee, 0xe6, 0x14, 0x87, 0xd4, 0x1a, 0x4a, 0xba, 0x0c, 0xf7, 0xab, 0x64, 0x7b, 0x39, 0x05,
	0xd6, 0x02, 0xa2, 0x13, 0xce, 0x02, 0xeb, 0x9b, 0xfc, 0x09, 0xef, 0x08, 0x5c, 0xc6, 0x8d, 0xb9,
	0x97, 0x34, 0xf7, 0xa2, 0x60, 0xa9, 0xd9, 0x88, 0x86, 0xf0, 0x1f, 0xf2, 0x09, 0x00, 0x00, 0xff,
	0xff, 0xb4, 0xbf, 0x14, 0x77, 0x9d, 0x00, 0x00, 0x00,
}

func init() {
	xxx_A_ProtoFile_FileDesc.Messages = xxx_A_ProtoFile_MessageDescs[0:1]
	var err error
	A_ProtoFile, err = prototype.NewFile(&xxx_A_ProtoFile_FileDesc)
	if err != nil {
		panic(err)
	}
}

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

var A_ProtoFile protoreflect.FileDescriptor

var xxx_A_ProtoFile_FileDesc = prototype.File{
	Syntax:  protoreflect.Proto2,
	Path:    "import_public/sub2/a.proto",
	Package: "goproto.protoc.import_public.sub2",
}
var xxx_A_ProtoFile_MessageTypes = [1]protoimpl.MessageType{
	{Type: prototype.GoMessage(
		xxx_A_ProtoFile_MessageDescs[0].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_Sub2Message{new(Sub2Message)}
		},
	)},
}
var xxx_A_ProtoFile_MessageDescs = [1]prototype.Message{
	{
		Name: "Sub2Message",
	},
}
