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

package known_proto

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)

// A generic empty message that you can re-use to avoid defining duplicated
// empty messages in your APIs. A typical example is to use it as the request
// or the response type of an API method. For instance:
//
//     service Foo {
//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
//     }
//
// The JSON representation for `Empty` is empty JSON object `{}`.
type Empty struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

func (*Empty) ProtoMessage() {}

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

func (m *Empty) XXX_Methods() *protoiface.Methods {
	return xxx_File_google_protobuf_empty_proto_messageTypes[0].Methods()
}

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

func (*Empty) XXX_WellKnownType() string { return "Empty" }

var File_google_protobuf_empty_proto protoreflect.FileDescriptor

var xxx_File_google_protobuf_empty_proto_rawDesc = []byte{
	0x0a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
	0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x22, 0x07,
	0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x84, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42,
	0x0a, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 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, 0x74, 0x79, 0x70,
	0x65, 0x73, 0x2f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x3b, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x03, 0x47, 0x50, 0x42, 0xaa, 0x02, 0x1e,
	0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
	0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	xxx_File_google_protobuf_empty_proto_rawDesc_once sync.Once
	xxx_File_google_protobuf_empty_proto_rawDesc_data = xxx_File_google_protobuf_empty_proto_rawDesc
)

func xxx_File_google_protobuf_empty_proto_rawDescGZIP() []byte {
	xxx_File_google_protobuf_empty_proto_rawDesc_once.Do(func() {
		xxx_File_google_protobuf_empty_proto_rawDesc_data = protoimpl.X.CompressGZIP(xxx_File_google_protobuf_empty_proto_rawDesc_data)
	})
	return xxx_File_google_protobuf_empty_proto_rawDesc_data
}

var xxx_File_google_protobuf_empty_proto_messageTypes = make([]protoimpl.MessageType, 1)
var xxx_File_google_protobuf_empty_proto_goTypes = []interface{}{
	(*Empty)(nil), // 0: google.protobuf.Empty
}
var xxx_File_google_protobuf_empty_proto_depIdxs = []int32{}

func init() { xxx_File_google_protobuf_empty_proto_init() }
func xxx_File_google_protobuf_empty_proto_init() {
	if File_google_protobuf_empty_proto != nil {
		return
	}
	File_google_protobuf_empty_proto = protoimpl.FileBuilder{
		RawDescriptor:      xxx_File_google_protobuf_empty_proto_rawDesc,
		GoTypes:            xxx_File_google_protobuf_empty_proto_goTypes,
		DependencyIndexes:  xxx_File_google_protobuf_empty_proto_depIdxs,
		MessageOutputTypes: xxx_File_google_protobuf_empty_proto_messageTypes,
		FilesRegistry:      protoregistry.GlobalFiles,
		TypesRegistry:      protoregistry.GlobalTypes,
	}.Init()
	xxx_File_google_protobuf_empty_proto_rawDesc = nil
	xxx_File_google_protobuf_empty_proto_goTypes = nil
	xxx_File_google_protobuf_empty_proto_depIdxs = nil
}
