// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/geo_targeting_restriction.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// 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

// A restriction used to determine if the request context's
// geo should be matched.
type GeoTargetingRestrictionEnum_GeoTargetingRestriction int32

const (
	// Not specified.
	GeoTargetingRestrictionEnum_UNSPECIFIED GeoTargetingRestrictionEnum_GeoTargetingRestriction = 0
	// Used for return value only. Represents value unknown in this version.
	GeoTargetingRestrictionEnum_UNKNOWN GeoTargetingRestrictionEnum_GeoTargetingRestriction = 1
	// Indicates that request context should match the physical location of
	// the user.
	GeoTargetingRestrictionEnum_LOCATION_OF_PRESENCE GeoTargetingRestrictionEnum_GeoTargetingRestriction = 2
)

var GeoTargetingRestrictionEnum_GeoTargetingRestriction_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "LOCATION_OF_PRESENCE",
}

var GeoTargetingRestrictionEnum_GeoTargetingRestriction_value = map[string]int32{
	"UNSPECIFIED":          0,
	"UNKNOWN":              1,
	"LOCATION_OF_PRESENCE": 2,
}

func (x GeoTargetingRestrictionEnum_GeoTargetingRestriction) String() string {
	return proto.EnumName(GeoTargetingRestrictionEnum_GeoTargetingRestriction_name, int32(x))
}

func (GeoTargetingRestrictionEnum_GeoTargetingRestriction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_4bebe6870a1193bf, []int{0, 0}
}

// Message describing feed item geo targeting restriction.
type GeoTargetingRestrictionEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GeoTargetingRestrictionEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.GeoTargetingRestrictionEnum_GeoTargetingRestriction", GeoTargetingRestrictionEnum_GeoTargetingRestriction_name, GeoTargetingRestrictionEnum_GeoTargetingRestriction_value)
	proto.RegisterType((*GeoTargetingRestrictionEnum)(nil), "google.ads.googleads.v3.enums.GeoTargetingRestrictionEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/geo_targeting_restriction.proto", fileDescriptor_4bebe6870a1193bf)
}

var fileDescriptor_4bebe6870a1193bf = []byte{
	// 311 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4a, 0x03, 0x31,
	0x18, 0xc5, 0xed, 0x08, 0x0a, 0xe9, 0xc2, 0x32, 0x08, 0x8a, 0xb6, 0x8b, 0xf6, 0x00, 0x99, 0x45,
	0x76, 0x11, 0x17, 0x69, 0x4d, 0x4b, 0x51, 0x32, 0x63, 0xff, 0x09, 0x32, 0x30, 0xc4, 0x4e, 0x08,
	0x03, 0x6d, 0x32, 0x4c, 0xd2, 0x1e, 0xc8, 0xa5, 0x47, 0xf1, 0x28, 0xee, 0xbc, 0x81, 0x4c, 0xe2,
	0xd4, 0x55, 0xdd, 0x84, 0x47, 0xde, 0xf7, 0x7b, 0xf9, 0xf2, 0xc0, 0xbd, 0xd4, 0x5a, 0x6e, 0x44,
	0xc4, 0x73, 0x13, 0x79, 0x59, 0xab, 0x3d, 0x8a, 0x84, 0xda, 0x6d, 0x4d, 0x24, 0x85, 0xce, 0x2c,
	0xaf, 0xa4, 0xb0, 0x85, 0x92, 0x59, 0x25, 0x8c, 0xad, 0x8a, 0xb5, 0x2d, 0xb4, 0x82, 0x65, 0xa5,
	0xad, 0x0e, 0x7b, 0x9e, 0x81, 0x3c, 0x37, 0xf0, 0x80, 0xc3, 0x3d, 0x82, 0x0e, 0xbf, 0xe9, 0x36,
	0xe9, 0x65, 0x11, 0x71, 0xa5, 0xb4, 0xe5, 0x35, 0x6b, 0x3c, 0x3c, 0x28, 0xc1, 0xed, 0x44, 0xe8,
	0x45, 0x13, 0x3f, 0xfb, 0x4b, 0xa7, 0x6a, 0xb7, 0x1d, 0x3c, 0x83, 0xab, 0x23, 0x76, 0x78, 0x01,
	0xda, 0x4b, 0x36, 0x4f, 0xe8, 0x68, 0x3a, 0x9e, 0xd2, 0x87, 0xce, 0x49, 0xd8, 0x06, 0xe7, 0x4b,
	0xf6, 0xc8, 0xe2, 0x17, 0xd6, 0x69, 0x85, 0xd7, 0xe0, 0xf2, 0x29, 0x1e, 0x91, 0xc5, 0x34, 0x66,
	0x59, 0x3c, 0xce, 0x92, 0x19, 0x9d, 0x53, 0x36, 0xa2, 0x9d, 0x60, 0xf8, 0xdd, 0x02, 0xfd, 0xb5,
	0xde, 0xc2, 0x7f, 0xb7, 0x1e, 0x76, 0x8f, 0x3c, 0x9b, 0xd4, 0x5b, 0x27, 0xad, 0xd7, 0xe1, 0x2f,
	0x2e, 0xf5, 0x86, 0x2b, 0x09, 0x75, 0x25, 0x23, 0x29, 0x94, 0xfb, 0x53, 0xd3, 0x61, 0x59, 0x98,
	0x23, 0x95, 0xde, 0xb9, 0xf3, 0x3d, 0x38, 0x9d, 0x10, 0xf2, 0x11, 0xf4, 0x26, 0x3e, 0x8a, 0xe4,
	0x06, 0x7a, 0x59, 0xab, 0x15, 0x82, 0x75, 0x03, 0xe6, 0xb3, 0xf1, 0x53, 0x92, 0x9b, 0xf4, 0xe0,
	0xa7, 0x2b, 0x94, 0x3a, 0xff, 0x2b, 0xe8, 0xfb, 0x4b, 0x8c, 0x49, 0x6e, 0x30, 0x3e, 0x4c, 0x60,
	0xbc, 0x42, 0x18, 0xbb, 0x99, 0xb7, 0x33, 0xb7, 0x18, 0xfa, 0x09, 0x00, 0x00, 0xff, 0xff, 0xf0,
	0x1b, 0xb4, 0x13, 0xea, 0x01, 0x00, 0x00,
}
