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

package base

import (
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	protoregistry "github.com/golang/protobuf/v2/reflect/protoregistry"
	protoiface "github.com/golang/protobuf/v2/runtime/protoiface"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
	sync "sync"
)

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

type BaseMessage struct {
	Field                  *string                     `protobuf:"bytes,1,opt,name=field" json:"field,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}                    `json:"-"`
	XXX_InternalExtensions protoimpl.ExtensionFieldsV1 `json:"-"`
	XXX_unrecognized       []byte                      `json:"-"`
	XXX_sizecache          int32                       `json:"-"`
}

func (x *BaseMessage) Reset() {
	*x = BaseMessage{}
}

func (x *BaseMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BaseMessage) ProtoMessage() {}

func (x *BaseMessage) ProtoReflect() protoreflect.Message {
	return xxx_File_extensions_base_base_proto_messageTypes[0].MessageOf(x)
}

func (m *BaseMessage) XXX_Methods() *protoiface.Methods {
	return xxx_File_extensions_base_base_proto_messageTypes[0].Methods()
}

// Deprecated: Use BaseMessage.ProtoReflect.Type instead.
func (*BaseMessage) Descriptor() ([]byte, []int) {
	return xxx_File_extensions_base_base_proto_rawDescGZIP(), []int{0}
}

var extRange_BaseMessage = []protoiface.ExtensionRangeV1{
	{Start: 4, End: 9},
	{Start: 16, End: 536870911},
}

// Deprecated: Use BaseMessage.ProtoReflect.Type.ExtensionRanges instead.
func (*BaseMessage) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
	return extRange_BaseMessage
}

func (x *BaseMessage) GetField() string {
	if x != nil && x.Field != nil {
		return *x.Field
	}
	return ""
}

type MessageSetWireFormatMessage struct {
	XXX_NoUnkeyedLiteral   struct{}                    `json:"-"`
	XXX_InternalExtensions protoimpl.ExtensionFieldsV1 `protobuf_messageset:"1" json:"-"`
	XXX_unrecognized       []byte                      `json:"-"`
	XXX_sizecache          int32                       `json:"-"`
}

func (x *MessageSetWireFormatMessage) Reset() {
	*x = MessageSetWireFormatMessage{}
}

func (x *MessageSetWireFormatMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MessageSetWireFormatMessage) ProtoMessage() {}

func (x *MessageSetWireFormatMessage) ProtoReflect() protoreflect.Message {
	return xxx_File_extensions_base_base_proto_messageTypes[1].MessageOf(x)
}

func (m *MessageSetWireFormatMessage) XXX_Methods() *protoiface.Methods {
	return xxx_File_extensions_base_base_proto_messageTypes[1].Methods()
}

// Deprecated: Use MessageSetWireFormatMessage.ProtoReflect.Type instead.
func (*MessageSetWireFormatMessage) Descriptor() ([]byte, []int) {
	return xxx_File_extensions_base_base_proto_rawDescGZIP(), []int{1}
}

var extRange_MessageSetWireFormatMessage = []protoiface.ExtensionRangeV1{
	{Start: 100, End: 2147483646},
}

// Deprecated: Use MessageSetWireFormatMessage.ProtoReflect.Type.ExtensionRanges instead.
func (*MessageSetWireFormatMessage) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
	return extRange_MessageSetWireFormatMessage
}

var File_extensions_base_base_proto protoreflect.FileDescriptor

var xxx_File_extensions_base_base_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x62, 0x61, 0x73,
	0x65, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2e, 0x65, 0x78, 0x74,
	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x0b, 0x42,
	0x61, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69,
	0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64,
	0x2a, 0x04, 0x08, 0x04, 0x10, 0x0a, 0x2a, 0x08, 0x08, 0x10, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02,
	0x22, 0x2b, 0x0a, 0x1b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69,
	0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a,
	0x08, 0x08, 0x64, 0x10, 0xff, 0xff, 0xff, 0xff, 0x07, 0x3a, 0x02, 0x08, 0x01, 0x42, 0x4a, 0x5a,
	0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61,
	0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x32, 0x2f, 0x63,
	0x6d, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x67, 0x6f,
	0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
	0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65,
}

var (
	xxx_File_extensions_base_base_proto_rawDesc_once sync.Once
	xxx_File_extensions_base_base_proto_rawDesc_data = xxx_File_extensions_base_base_proto_rawDesc
)

func xxx_File_extensions_base_base_proto_rawDescGZIP() []byte {
	xxx_File_extensions_base_base_proto_rawDesc_once.Do(func() {
		xxx_File_extensions_base_base_proto_rawDesc_data = protoimpl.X.CompressGZIP(xxx_File_extensions_base_base_proto_rawDesc_data)
	})
	return xxx_File_extensions_base_base_proto_rawDesc_data
}

var xxx_File_extensions_base_base_proto_messageTypes = make([]protoimpl.MessageType, 2)
var xxx_File_extensions_base_base_proto_goTypes = []interface{}{
	(*BaseMessage)(nil),                 // 0: goproto.protoc.extension.base.BaseMessage
	(*MessageSetWireFormatMessage)(nil), // 1: goproto.protoc.extension.base.MessageSetWireFormatMessage
}
var xxx_File_extensions_base_base_proto_depIdxs = []int32{}

func init() { xxx_File_extensions_base_base_proto_init() }
func xxx_File_extensions_base_base_proto_init() {
	if File_extensions_base_base_proto != nil {
		return
	}
	File_extensions_base_base_proto = protoimpl.FileBuilder{
		RawDescriptor:      xxx_File_extensions_base_base_proto_rawDesc,
		GoTypes:            xxx_File_extensions_base_base_proto_goTypes,
		DependencyIndexes:  xxx_File_extensions_base_base_proto_depIdxs,
		MessageOutputTypes: xxx_File_extensions_base_base_proto_messageTypes,
		FilesRegistry:      protoregistry.GlobalFiles,
		TypesRegistry:      protoregistry.GlobalTypes,
	}.Init()
	xxx_File_extensions_base_base_proto_rawDesc = nil
	xxx_File_extensions_base_base_proto_goTypes = nil
	xxx_File_extensions_base_base_proto_depIdxs = nil
}
