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

package resources // import "google.golang.org/genproto/googleapis/ads/googleads/v0/resources"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import 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.ProtoPackageIsVersion2 // please upgrade the proto package

// A campaign audience view.
// Includes performance data from interests and remarketing lists for Display
// Network and YouTube Network ads, and remarketing lists for search ads (RLSA),
// aggregated by campaign and audience criterion. This view only includes
// audiences attached at the campaign level.
type CampaignAudienceView struct {
	// The resource name of the campaign audience view.
	// Campaign audience view resource names have the form:
	//
	//
	// `customers/{customer_id}/campaignAudienceViews/{campaign_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 *CampaignAudienceView) Reset()         { *m = CampaignAudienceView{} }
func (m *CampaignAudienceView) String() string { return proto.CompactTextString(m) }
func (*CampaignAudienceView) ProtoMessage()    {}
func (*CampaignAudienceView) Descriptor() ([]byte, []int) {
	return fileDescriptor_campaign_audience_view_597e3d8f42495af1, []int{0}
}
func (m *CampaignAudienceView) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CampaignAudienceView.Unmarshal(m, b)
}
func (m *CampaignAudienceView) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CampaignAudienceView.Marshal(b, m, deterministic)
}
func (dst *CampaignAudienceView) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CampaignAudienceView.Merge(dst, src)
}
func (m *CampaignAudienceView) XXX_Size() int {
	return xxx_messageInfo_CampaignAudienceView.Size(m)
}
func (m *CampaignAudienceView) XXX_DiscardUnknown() {
	xxx_messageInfo_CampaignAudienceView.DiscardUnknown(m)
}

var xxx_messageInfo_CampaignAudienceView proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterFile("google/ads/googleads/v0/resources/campaign_audience_view.proto", fileDescriptor_campaign_audience_view_597e3d8f42495af1)
}

var fileDescriptor_campaign_audience_view_597e3d8f42495af1 = []byte{
	// 237 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x4b, 0xcf, 0xcf, 0x4f,
	0xcf, 0x49, 0xd5, 0x4f, 0x4c, 0x29, 0xd6, 0x87, 0x30, 0x41, 0xac, 0x32, 0x03, 0xfd, 0xa2, 0xd4,
	0xe2, 0xfc, 0xd2, 0xa2, 0xe4, 0xd4, 0x62, 0xfd, 0xe4, 0xc4, 0xdc, 0x82, 0xc4, 0xcc, 0xf4, 0xbc,
	0xf8, 0xc4, 0xd2, 0x94, 0xcc, 0xd4, 0xbc, 0xe4, 0xd4, 0xf8, 0xb2, 0xcc, 0xd4, 0x72, 0xbd, 0x82,
	0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x45, 0x88, 0x26, 0xbd, 0xc4, 0x94, 0x62, 0x3d, 0xb8, 0x7e, 0xbd,
	0x32, 0x03, 0x3d, 0xb8, 0x7e, 0x25, 0x6b, 0x2e, 0x11, 0x67, 0xa8, 0x11, 0x8e, 0x50, 0x13, 0xc2,
	0x32, 0x53, 0xcb, 0x85, 0x94, 0xb9, 0x78, 0x61, 0x8a, 0xe2, 0xf3, 0x12, 0x73, 0x53, 0x25, 0x18,
	0x15, 0x18, 0x35, 0x38, 0x83, 0x78, 0x60, 0x82, 0x7e, 0x89, 0xb9, 0xa9, 0x4e, 0xf7, 0x18, 0xb9,
	0x54, 0x93, 0xf3, 0x73, 0xf5, 0x08, 0x5a, 0xe3, 0x24, 0x89, 0xcd, 0x92, 0x00, 0x90, 0x23, 0x03,
	0x18, 0xa3, 0xbc, 0xa0, 0xfa, 0xd3, 0xf3, 0x73, 0x12, 0xf3, 0xd2, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5,
	0xd3, 0x53, 0xf3, 0xc0, 0x5e, 0x80, 0x79, 0xbb, 0x20, 0xb3, 0x18, 0x4f, 0x28, 0x58, 0xc3, 0x59,
	0x8b, 0x98, 0x98, 0xdd, 0x1d, 0x1d, 0x57, 0x31, 0x29, 0xba, 0x43, 0x8c, 0x74, 0x4c, 0x29, 0xd6,
	0x83, 0x30, 0x41, 0xac, 0x30, 0x03, 0xbd, 0x20, 0x98, 0xca, 0x53, 0x30, 0x35, 0x31, 0x8e, 0x29,
	0xc5, 0x31, 0x70, 0x35, 0x31, 0x61, 0x06, 0x31, 0x70, 0x35, 0x49, 0x6c, 0x60, 0x47, 0x18, 0x03,
	0x02, 0x00, 0x00, 0xff, 0xff, 0x29, 0xac, 0x5f, 0xd7, 0x89, 0x01, 0x00, 0x00,
}
