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

package resources

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

// An age range view.
type AgeRangeView struct {
	// The resource name of the age range view.
	// Age range view resource names have the form:
	//
	// `customers/{customer_id}/ageRangeViews/{ad_group_id}~{criterion_id}`
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AgeRangeView proto.InternalMessageInfo

func (m *AgeRangeView) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func init() {
	proto.RegisterType((*AgeRangeView)(nil), "google.ads.googleads.v3.resources.AgeRangeView")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/age_range_view.proto", fileDescriptor_b1b9693e56ac43d6)
}

var fileDescriptor_b1b9693e56ac43d6 = []byte{
	// 315 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xb1, 0x4a, 0x03, 0x41,
	0x10, 0x86, 0xb9, 0x08, 0x82, 0x47, 0x2c, 0x4c, 0xa5, 0xc1, 0xc2, 0x28, 0x01, 0xab, 0xdd, 0x62,
	0xc1, 0x62, 0xad, 0x36, 0x4d, 0xc0, 0x42, 0x42, 0x8a, 0x2b, 0xe4, 0xe0, 0x58, 0xef, 0x86, 0xe5,
	0x20, 0xb7, 0x13, 0x6e, 0x2e, 0x49, 0x11, 0xf2, 0x16, 0x3e, 0x81, 0xa5, 0x8f, 0xe2, 0xa3, 0xe4,
	0x21, 0x44, 0x2e, 0x9b, 0xdd, 0x24, 0x8d, 0x76, 0x3f, 0x3b, 0xdf, 0xff, 0xcf, 0xfc, 0x6c, 0xfc,
	0x64, 0x10, 0xcd, 0x0c, 0xb8, 0x2e, 0x88, 0x3b, 0xd9, 0xaa, 0xa5, 0xe0, 0x35, 0x10, 0x2e, 0xea,
	0x1c, 0x88, 0x6b, 0x03, 0x59, 0xad, 0xad, 0x81, 0x6c, 0x59, 0xc2, 0x8a, 0xcd, 0x6b, 0x6c, 0xb0,
	0x37, 0x70, 0x30, 0xd3, 0x05, 0xb1, 0xe0, 0x63, 0x4b, 0xc1, 0x82, 0xaf, 0x7f, 0xe3, 0xa3, 0xe7,
	0x65, 0x48, 0x73, 0xee, 0xfe, 0xed, 0xd1, 0x48, 0x5b, 0x8b, 0x8d, 0x6e, 0x4a, 0xb4, 0xe4, 0xa6,
	0xf7, 0x1f, 0x51, 0xdc, 0x55, 0x06, 0xa6, 0xed, 0xce, 0xa4, 0x84, 0x55, 0xef, 0x21, 0xbe, 0xf4,
	0x01, 0x99, 0xd5, 0x15, 0x5c, 0x47, 0x77, 0xd1, 0xe3, 0xc5, 0xb4, 0xeb, 0x1f, 0x5f, 0x75, 0x05,
	0x32, 0xdb, 0xaa, 0x34, 0x1e, 0x1e, 0x6e, 0xd9, 0xab, 0x79, 0x49, 0x2c, 0xc7, 0x8a, 0x9f, 0x04,
	0x8a, 0x7c, 0x41, 0x0d, 0x56, 0x50, 0x13, 0x5f, 0x7b, 0xb9, 0x69, 0x8b, 0x06, 0x84, 0xf8, 0xfa,
	0xb4, 0xf7, 0x66, 0xf4, 0x13, 0xc5, 0xc3, 0x1c, 0x2b, 0xf6, 0x6f, 0xf3, 0xd1, 0xd5, 0xf1, 0xb2,
	0x49, 0xdb, 0x69, 0x12, 0xbd, 0xbd, 0xec, 0x7d, 0x06, 0x67, 0xda, 0x1a, 0x86, 0xb5, 0xe1, 0x06,
	0xec, 0xae, 0x31, 0x3f, 0xdc, 0xfa, 0xc7, 0x47, 0x3c, 0x07, 0xf5, 0xd9, 0x39, 0x1b, 0x2b, 0xf5,
	0xd5, 0x19, 0x8c, 0x5d, 0xa4, 0x2a, 0x88, 0x39, 0xd9, 0xaa, 0x44, 0xb0, 0xa9, 0x27, 0xbf, 0x3d,
	0x93, 0xaa, 0x82, 0xd2, 0xc0, 0xa4, 0x89, 0x48, 0x03, 0xb3, 0xed, 0x0c, 0xdd, 0x40, 0x4a, 0x55,
	0x90, 0x94, 0x81, 0x92, 0x32, 0x11, 0x52, 0x06, 0xee, 0xfd, 0x7c, 0x77, 0xac, 0xf8, 0x0d, 0x00,
	0x00, 0xff, 0xff, 0xb4, 0x84, 0xe5, 0x40, 0x34, 0x02, 0x00, 0x00,
}
