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

package common

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "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

// Collection of urls that is tagged with a unique identifier.
type UrlCollection struct {
	// Unique identifier for this UrlCollection instance.
	UrlCollectionId *wrappers.StringValue `protobuf:"bytes,1,opt,name=url_collection_id,json=urlCollectionId,proto3" json:"url_collection_id,omitempty"`
	// A list of possible final URLs.
	FinalUrls []*wrappers.StringValue `protobuf:"bytes,2,rep,name=final_urls,json=finalUrls,proto3" json:"final_urls,omitempty"`
	// A list of possible final mobile URLs.
	FinalMobileUrls []*wrappers.StringValue `protobuf:"bytes,3,rep,name=final_mobile_urls,json=finalMobileUrls,proto3" json:"final_mobile_urls,omitempty"`
	// URL template for constructing a tracking URL.
	TrackingUrlTemplate  *wrappers.StringValue `protobuf:"bytes,4,opt,name=tracking_url_template,json=trackingUrlTemplate,proto3" json:"tracking_url_template,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_UrlCollection proto.InternalMessageInfo

func (m *UrlCollection) GetUrlCollectionId() *wrappers.StringValue {
	if m != nil {
		return m.UrlCollectionId
	}
	return nil
}

func (m *UrlCollection) GetFinalUrls() []*wrappers.StringValue {
	if m != nil {
		return m.FinalUrls
	}
	return nil
}

func (m *UrlCollection) GetFinalMobileUrls() []*wrappers.StringValue {
	if m != nil {
		return m.FinalMobileUrls
	}
	return nil
}

func (m *UrlCollection) GetTrackingUrlTemplate() *wrappers.StringValue {
	if m != nil {
		return m.TrackingUrlTemplate
	}
	return nil
}

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

func init() {
	proto.RegisterFile("google/ads/googleads/v3/common/url_collection.proto", fileDescriptor_0a1d955dae37e0d9)
}

var fileDescriptor_0a1d955dae37e0d9 = []byte{
	// 368 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x4b, 0xf3, 0x30,
	0x18, 0xc7, 0x69, 0xf7, 0xf2, 0x82, 0x15, 0x19, 0x56, 0x84, 0x31, 0xc6, 0x18, 0x3b, 0x79, 0x4a,
	0xc0, 0xde, 0xb2, 0x53, 0x37, 0x61, 0x7a, 0x10, 0x86, 0xba, 0x1e, 0xa4, 0x50, 0xb2, 0x36, 0x0b,
	0xc1, 0x34, 0x29, 0x49, 0x3b, 0xbf, 0x8f, 0x47, 0x8f, 0x7e, 0x0c, 0x3f, 0x8a, 0xe0, 0x77, 0x90,
	0x26, 0x6d, 0x71, 0x07, 0x75, 0xa7, 0x3e, 0x34, 0xff, 0xdf, 0xef, 0x79, 0xda, 0x3c, 0x5e, 0x40,
	0xa5, 0xa4, 0x9c, 0x40, 0x9c, 0x69, 0x68, 0xcb, 0xba, 0xda, 0x05, 0x30, 0x95, 0x79, 0x2e, 0x05,
	0xac, 0x14, 0x4f, 0x52, 0xc9, 0x39, 0x49, 0x4b, 0x26, 0x05, 0x28, 0x94, 0x2c, 0xa5, 0x3f, 0xb6,
	0x49, 0x80, 0x33, 0x0d, 0x3a, 0x08, 0xec, 0x02, 0x60, 0xa1, 0x61, 0x73, 0x0e, 0x4d, 0x7a, 0x53,
	0x6d, 0xe1, 0xb3, 0xc2, 0x45, 0x41, 0x94, 0xb6, 0xfc, 0x70, 0xd4, 0x36, 0x2d, 0x18, 0xc4, 0x42,
	0xc8, 0x12, 0xd7, 0xf2, 0xe6, 0x74, 0xfa, 0xe6, 0x7a, 0x27, 0x6b, 0xc5, 0x17, 0x5d, 0x57, 0xff,
	0xda, 0x3b, 0xdd, 0x9f, 0x23, 0x61, 0xd9, 0xc0, 0x99, 0x38, 0x17, 0xc7, 0x97, 0xa3, 0x66, 0x00,
	0xd0, 0xf6, 0x02, 0xf7, 0xa5, 0x62, 0x82, 0x46, 0x98, 0x57, 0xe4, 0xae, 0x5f, 0x7d, 0xf7, 0xdc,
	0x64, 0xfe, 0xcc, 0xf3, 0xb6, 0x4c, 0x60, 0x9e, 0x54, 0x8a, 0xeb, 0x81, 0x3b, 0xe9, 0xfd, 0xa9,
	0x38, 0x32, 0xf9, 0xb5, 0xe2, 0xba, 0x1e, 0xc3, 0xc2, 0xb9, 0xdc, 0x30, 0x4e, 0xac, 0xa3, 0x77,
	0x80, 0xa3, 0x6f, 0xb0, 0x5b, 0x43, 0x19, 0xd3, 0xca, 0x3b, 0x2f, 0x15, 0x4e, 0x9f, 0x98, 0xa0,
	0xb5, 0x25, 0x29, 0x49, 0x5e, 0x70, 0x5c, 0x92, 0xc1, 0xbf, 0x03, 0x3e, 0xea, 0xac, 0x45, 0xd7,
	0x8a, 0x3f, 0x34, 0xe0, 0xfc, 0xd3, 0xf1, 0xa6, 0xa9, 0xcc, 0xc1, 0xef, 0x37, 0x33, 0xf7, 0xf7,
	0x7e, 0xec, 0xaa, 0xd6, 0xaf, 0x9c, 0xc7, 0xab, 0x86, 0xa2, 0x92, 0x63, 0x41, 0x81, 0x54, 0x14,
	0x52, 0x22, 0x4c, 0xf3, 0x76, 0x29, 0x0a, 0xa6, 0x7f, 0xda, 0x91, 0x99, 0x7d, 0xbc, 0xb8, 0xbd,
	0x65, 0x18, 0xbe, 0xba, 0xe3, 0xa5, 0x95, 0x85, 0x99, 0x06, 0xb6, 0xac, 0xab, 0x28, 0x00, 0x0b,
	0x13, 0x7b, 0x6f, 0x03, 0x71, 0x98, 0xe9, 0xb8, 0x0b, 0xc4, 0x51, 0x10, 0xdb, 0xc0, 0x87, 0x3b,
	0xb5, 0x6f, 0x11, 0x0a, 0x33, 0x8d, 0x50, 0x17, 0x41, 0x28, 0x0a, 0x10, 0xb2, 0xa1, 0xcd, 0x7f,
	0x33, 0x5d, 0xf0, 0x15, 0x00, 0x00, 0xff, 0xff, 0xec, 0x05, 0x93, 0xfe, 0xc0, 0x02, 0x00, 0x00,
}
