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

package enums

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	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

// The possible policy topic evidence destination not working devices.
type PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice int32

const (
	// No value has been specified.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_UNSPECIFIED PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_UNKNOWN PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 1
	// Landing page doesn't work on desktop device.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_DESKTOP PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 2
	// Landing page doesn't work on Android device.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_ANDROID PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 3
	// Landing page doesn't work on iOS device.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_IOS PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 4
)

var PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "DESKTOP",
	3: "ANDROID",
	4: "IOS",
}

var PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"DESKTOP":     2,
	"ANDROID":     3,
	"IOS":         4,
}

func (x PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice) String() string {
	return proto.EnumName(PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_name, int32(x))
}

func (PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_b250d4f29aab2ed4, []int{0, 0}
}

// Container for enum describing possible policy topic evidence destination not
// working devices.
type PolicyTopicEvidenceDestinationNotWorkingDeviceEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PolicyTopicEvidenceDestinationNotWorkingDeviceEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v2.enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice", PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_name, PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_value)
	proto.RegisterType((*PolicyTopicEvidenceDestinationNotWorkingDeviceEnum)(nil), "google.ads.googleads.v2.enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v2/enums/policy_topic_evidence_destination_not_working_device.proto", fileDescriptor_b250d4f29aab2ed4)
}

var fileDescriptor_b250d4f29aab2ed4 = []byte{
	// 353 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0x4f, 0x6a, 0xeb, 0x30,
	0x10, 0xc6, 0x5f, 0x9c, 0xc7, 0x0b, 0x38, 0x8b, 0x67, 0xbc, 0x7c, 0xbc, 0x2c, 0x92, 0x03, 0xc8,
	0xe0, 0xec, 0xd4, 0x95, 0x53, 0xbb, 0xc1, 0x04, 0x6c, 0xd3, 0xfc, 0x2b, 0xc5, 0x60, 0x5c, 0x4b,
	0x18, 0xd1, 0x44, 0xe3, 0x46, 0x8a, 0x4b, 0x6f, 0xd0, 0x73, 0x74, 0x53, 0xe8, 0x51, 0x7a, 0x94,
	0x9e, 0xa2, 0x48, 0x4a, 0xd2, 0x55, 0x0b, 0xd9, 0x98, 0x6f, 0x3c, 0x33, 0xdf, 0x6f, 0x34, 0x63,
	0xdf, 0xd4, 0x00, 0xf5, 0x86, 0x7a, 0x25, 0x11, 0x9e, 0x91, 0x4a, 0xb5, 0xbe, 0x47, 0xf9, 0x7e,
	0x2b, 0xbc, 0x06, 0x36, 0xac, 0x7a, 0x2a, 0x24, 0x34, 0xac, 0x2a, 0x68, 0xcb, 0x08, 0xe5, 0x15,
	0x2d, 0x08, 0x15, 0x92, 0xf1, 0x52, 0x32, 0xe0, 0x05, 0x07, 0x59, 0x3c, 0xc2, 0xee, 0x9e, 0xf1,
	0xba, 0x20, 0xb4, 0x65, 0x15, 0x45, 0xcd, 0x0e, 0x24, 0xb8, 0x03, 0x63, 0x87, 0x4a, 0x22, 0xd0,
	0xc9, 0x19, 0xb5, 0x3e, 0xd2, 0xce, 0xff, 0xfe, 0x1f, 0xc1, 0x0d, 0xf3, 0x4a, 0xce, 0x41, 0x6a,
	0x3b, 0x61, 0x9a, 0x47, 0xaf, 0x1d, 0xdb, 0xcf, 0x34, 0x7b, 0xa1, 0xd0, 0xd1, 0x81, 0x1c, 0x7e,
	0x81, 0x13, 0x90, 0x6b, 0x83, 0x0d, 0x35, 0x35, 0xe2, 0xfb, 0xed, 0xe8, 0xc1, 0x46, 0xe7, 0x75,
	0xb9, 0x7f, 0xed, 0xfe, 0x32, 0x99, 0x67, 0xd1, 0x65, 0x7c, 0x15, 0x47, 0xa1, 0xf3, 0xcb, 0xed,
	0xdb, 0xbd, 0x65, 0x32, 0x4b, 0xd2, 0x75, 0xe2, 0x74, 0x54, 0x10, 0x46, 0xf3, 0xd9, 0x22, 0xcd,
	0x1c, 0x4b, 0x05, 0x41, 0x12, 0x5e, 0xa7, 0x71, 0xe8, 0x74, 0xdd, 0x9e, 0xdd, 0x8d, 0xd3, 0xb9,
	0xf3, 0x7b, 0xf2, 0x6c, 0xd9, 0xc3, 0x0a, 0xb6, 0xe8, 0xc7, 0xd7, 0x4e, 0xc6, 0xe7, 0x8d, 0x95,
	0xa9, 0x25, 0x64, 0x9d, 0xdb, 0xc9, 0xc1, 0xb5, 0x86, 0x4d, 0xc9, 0x6b, 0x04, 0xbb, 0xda, 0xab,
	0x29, 0xd7, 0x2b, 0x3a, 0x5e, 0xab, 0x61, 0xe2, 0x9b, 0xe3, 0x5d, 0xe8, 0xef, 0x8b, 0xd5, 0x9d,
	0x06, 0xc1, 0x9b, 0x35, 0x98, 0x1a, 0xab, 0x80, 0x08, 0x64, 0xa4, 0x52, 0x2b, 0x1f, 0xa9, 0xc5,
	0x89, 0xf7, 0x63, 0x3e, 0x0f, 0x88, 0xc8, 0x4f, 0xf9, 0x7c, 0xe5, 0xe7, 0x3a, 0xff, 0x61, 0x0d,
	0xcd, 0x4f, 0x8c, 0x03, 0x22, 0x30, 0x3e, 0x55, 0x60, 0xbc, 0xf2, 0x31, 0xd6, 0x35, 0x77, 0x7f,
	0xf4, 0x60, 0xe3, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x54, 0xfc, 0xc8, 0x39, 0x54, 0x02, 0x00,
	0x00,
}
