// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/campaign_audience_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

// 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_c3b43f13f60a17e8, []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 (m *CampaignAudienceView) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CampaignAudienceView.Merge(m, 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.v3.resources.CampaignAudienceView")
}

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

var fileDescriptor_c3b43f13f60a17e8 = []byte{
	// 325 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x31, 0x4b, 0x03, 0x31,
	0x18, 0x86, 0xb9, 0x13, 0x04, 0x0f, 0x5d, 0x8a, 0x83, 0x2d, 0x0e, 0x56, 0x29, 0xb8, 0x98, 0x0c,
	0xb7, 0x45, 0x10, 0xd2, 0x0e, 0x05, 0x07, 0x29, 0x1d, 0x6e, 0x90, 0x83, 0x12, 0x2f, 0x21, 0x04,
	0x9a, 0x7c, 0xc7, 0xe5, 0xda, 0x0e, 0xd2, 0xd5, 0x1f, 0xe2, 0xe8, 0xec, 0xaf, 0xf0, 0xa7, 0xf4,
	0x57, 0xc8, 0x35, 0x97, 0xb4, 0xc3, 0xa1, 0xdb, 0xcb, 0x7d, 0xcf, 0xfb, 0x7e, 0x5f, 0xde, 0x4b,
	0x9e, 0x24, 0x80, 0x5c, 0x0a, 0xcc, 0xb8, 0xc5, 0x4e, 0x36, 0x6a, 0x9d, 0xe2, 0x4a, 0x58, 0x58,
	0x55, 0x85, 0xb0, 0xb8, 0x60, 0xba, 0x64, 0x4a, 0x9a, 0x05, 0x5b, 0x71, 0x25, 0x4c, 0x21, 0x16,
	0x6b, 0x25, 0x36, 0xa8, 0xac, 0xa0, 0x86, 0xde, 0xd0, 0x99, 0x10, 0xe3, 0x16, 0x05, 0x3f, 0x5a,
	0xa7, 0x28, 0xf8, 0x07, 0x7d, 0xbf, 0xa2, 0x54, 0x21, 0xd5, 0xb9, 0x07, 0xd7, 0x47, 0x23, 0x66,
	0x0c, 0xd4, 0xac, 0x56, 0x60, 0xac, 0x9b, 0xde, 0x7e, 0x47, 0xc9, 0xe5, 0xa4, 0x5d, 0x4e, 0xdb,
	0xdd, 0x99, 0x12, 0x9b, 0xde, 0x5d, 0x72, 0xe1, 0x83, 0x16, 0x86, 0x69, 0x71, 0x15, 0xdd, 0x44,
	0xf7, 0x67, 0xf3, 0x73, 0xff, 0xf1, 0x85, 0x69, 0x41, 0x36, 0x3b, 0x5a, 0x27, 0x0f, 0x87, 0x9b,
	0x5a, 0x55, 0x2a, 0x8b, 0x0a, 0xd0, 0xb8, 0x33, 0x78, 0x52, 0xac, 0x6c, 0x0d, 0x5a, 0x54, 0x16,
	0xbf, 0x7b, 0xb9, 0x0d, 0x05, 0x1c, 0xa3, 0x0d, 0xd0, 0xd9, 0xcb, 0x76, 0xfc, 0x11, 0x27, 0xa3,
	0x02, 0x34, 0xfa, 0xb7, 0x99, 0x71, 0xbf, 0xeb, 0x88, 0x59, 0xf3, 0xf6, 0x59, 0xf4, 0xfa, 0xdc,
	0xfa, 0x25, 0x2c, 0x99, 0x91, 0x08, 0x2a, 0x89, 0xa5, 0x30, 0xfb, 0x66, 0xf0, 0xe1, 0x2d, 0x7f,
	0xfc, 0xb8, 0xc7, 0xa0, 0x3e, 0xe3, 0x93, 0x29, 0xa5, 0x5f, 0xf1, 0x70, 0xea, 0x22, 0x29, 0xb7,
	0xc8, 0xc9, 0x46, 0x65, 0x29, 0x9a, 0x7b, 0xf2, 0xc7, 0x33, 0x39, 0xe5, 0x36, 0x0f, 0x4c, 0x9e,
	0xa5, 0x79, 0x60, 0x76, 0xf1, 0xc8, 0x0d, 0x08, 0xa1, 0xdc, 0x12, 0x12, 0x28, 0x42, 0xb2, 0x94,
	0x90, 0xc0, 0xbd, 0x9d, 0xee, 0x8f, 0x4d, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xd3, 0x3e,
	0xb3, 0x64, 0x02, 0x00, 0x00,
}
