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

package common

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
	_ "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

// The site tag and event snippet pair for a TrackingCodeType.
type TagSnippet struct {
	// The type of the generated tag snippets for tracking conversions.
	Type enums.TrackingCodeTypeEnum_TrackingCodeType `protobuf:"varint,1,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.TrackingCodeTypeEnum_TrackingCodeType" json:"type,omitempty"`
	// The format of the web page where the tracking tag and snippet will be
	// installed, e.g. HTML.
	PageFormat enums.TrackingCodePageFormatEnum_TrackingCodePageFormat `protobuf:"varint,2,opt,name=page_format,json=pageFormat,proto3,enum=google.ads.googleads.v3.enums.TrackingCodePageFormatEnum_TrackingCodePageFormat" json:"page_format,omitempty"`
	// The site tag that adds visitors to your basic remarketing lists and sets
	// new cookies on your domain.
	GlobalSiteTag *wrappers.StringValue `protobuf:"bytes,3,opt,name=global_site_tag,json=globalSiteTag,proto3" json:"global_site_tag,omitempty"`
	// The event snippet that works with the site tag to track actions that
	// should be counted as conversions.
	EventSnippet         *wrappers.StringValue `protobuf:"bytes,4,opt,name=event_snippet,json=eventSnippet,proto3" json:"event_snippet,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_TagSnippet proto.InternalMessageInfo

func (m *TagSnippet) GetType() enums.TrackingCodeTypeEnum_TrackingCodeType {
	if m != nil {
		return m.Type
	}
	return enums.TrackingCodeTypeEnum_UNSPECIFIED
}

func (m *TagSnippet) GetPageFormat() enums.TrackingCodePageFormatEnum_TrackingCodePageFormat {
	if m != nil {
		return m.PageFormat
	}
	return enums.TrackingCodePageFormatEnum_UNSPECIFIED
}

func (m *TagSnippet) GetGlobalSiteTag() *wrappers.StringValue {
	if m != nil {
		return m.GlobalSiteTag
	}
	return nil
}

func (m *TagSnippet) GetEventSnippet() *wrappers.StringValue {
	if m != nil {
		return m.EventSnippet
	}
	return nil
}

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

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

var fileDescriptor_3d82c3f30f27f01d = []byte{
	// 420 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x4f, 0x6b, 0xdb, 0x30,
	0x14, 0xc7, 0x6e, 0xd9, 0x41, 0x5d, 0x57, 0xf0, 0x29, 0x94, 0x52, 0x4a, 0x4e, 0x3d, 0x49, 0xa3,
	0x86, 0x1d, 0x34, 0x76, 0x70, 0x9b, 0xad, 0xd7, 0x90, 0x84, 0x30, 0x46, 0xc0, 0xbc, 0xc4, 0xaf,
	0x42, 0xcc, 0x96, 0x34, 0x4b, 0xc9, 0xe8, 0xd7, 0xd9, 0x71, 0x1f, 0x65, 0x1f, 0x63, 0xc7, 0x7e,
	0x8a, 0x61, 0x49, 0x76, 0x07, 0x25, 0x63, 0x39, 0xf9, 0x67, 0xbd, 0xdf, 0x9f, 0xf7, 0xa4, 0x47,
	0xde, 0x0a, 0xad, 0x45, 0x8d, 0x0c, 0x2a, 0xcb, 0x02, 0xec, 0xd0, 0x2e, 0x67, 0x1b, 0xdd, 0x34,
	0x5a, 0x31, 0x07, 0xa2, 0xb4, 0x4a, 0x1a, 0x83, 0x8e, 0x9a, 0x56, 0x3b, 0x9d, 0x5d, 0x06, 0x1a,
	0x85, 0xca, 0xd2, 0x41, 0x41, 0x77, 0x39, 0x0d, 0x8a, 0xf3, 0x0f, 0xfb, 0x1c, 0x51, 0x6d, 0x1b,
	0xcb, 0x5c, 0x0b, 0x9b, 0xaf, 0x52, 0x89, 0x72, 0xa3, 0x2b, 0x2c, 0x0d, 0x08, 0x2c, 0x1f, 0x74,
	0xdb, 0x40, 0xb4, 0x3f, 0x7f, 0x77, 0x88, 0xdc, 0x3d, 0x1a, 0x8c, 0xba, 0xd8, 0x16, 0xf3, 0x7f,
	0xeb, 0xed, 0x03, 0xfb, 0xde, 0x82, 0x31, 0xd8, 0xda, 0x58, 0xbf, 0xe8, 0x7d, 0x8d, 0x64, 0xa0,
	0x94, 0x76, 0xe0, 0xa4, 0x56, 0xb1, 0x3a, 0xfe, 0x9d, 0x12, 0xb2, 0x00, 0x31, 0x0f, 0x93, 0x66,
	0x9f, 0xc9, 0x71, 0x67, 0x3d, 0x4a, 0xae, 0x92, 0xeb, 0x37, 0x37, 0x13, 0xba, 0x6f, 0x64, 0xdf,
	0x13, 0x5d, 0xc4, 0x9e, 0xee, 0x74, 0x85, 0x8b, 0x47, 0x83, 0x1f, 0xd5, 0xb6, 0x79, 0x71, 0x38,
	0xf3, 0x8e, 0xd9, 0x37, 0x72, 0xf2, 0xd7, 0xcc, 0xa3, 0xd4, 0x07, 0x4c, 0x0f, 0x08, 0x98, 0x82,
	0xc0, 0x4f, 0x5e, 0xfc, 0x22, 0xe6, 0xb9, 0x34, 0x23, 0x66, 0xc0, 0xd9, 0x84, 0x9c, 0x89, 0x5a,
	0xaf, 0xa1, 0x2e, 0xad, 0x74, 0x58, 0x3a, 0x10, 0xa3, 0xa3, 0xab, 0xe4, 0xfa, 0xe4, 0xe6, 0xa2,
	0x8f, 0xed, 0xef, 0x8c, 0xce, 0x5d, 0x2b, 0x95, 0x58, 0x42, 0xbd, 0xc5, 0xd9, 0x69, 0x10, 0xcd,
	0xa5, 0xc3, 0x05, 0x88, 0xac, 0x20, 0xa7, 0xb8, 0x43, 0xe5, 0xfa, 0x6d, 0x18, 0x1d, 0xff, 0x87,
	0xc7, 0x6b, 0x2f, 0x89, 0xb7, 0x7a, 0xfb, 0x94, 0x90, 0xf1, 0x46, 0x37, 0xf4, 0xdf, 0x0b, 0x74,
	0x7b, 0xf6, 0xfc, 0x10, 0xd3, 0xce, 0x74, 0x9a, 0x7c, 0x99, 0x44, 0x89, 0xd0, 0x35, 0x28, 0x41,
	0x75, 0x2b, 0x98, 0x40, 0xe5, 0x23, 0xfb, 0x25, 0x31, 0xd2, 0xee, 0x5b, 0xe2, 0xf7, 0xe1, 0xf3,
	0x23, 0x3d, 0xba, 0x2f, 0x8a, 0x9f, 0xe9, 0xe5, 0x7d, 0x30, 0x2b, 0x2a, 0x4b, 0x03, 0xec, 0xd0,
	0x32, 0xa7, 0x77, 0x9e, 0xf6, 0xab, 0x27, 0xac, 0x8a, 0xca, 0xae, 0x06, 0xc2, 0x6a, 0x99, 0xaf,
	0x02, 0xe1, 0x29, 0x1d, 0x87, 0x53, 0xce, 0x8b, 0xca, 0x72, 0x3e, 0x50, 0x38, 0x5f, 0xe6, 0x9c,
	0x07, 0xd2, 0xfa, 0x95, 0xef, 0x2e, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x72, 0x4c, 0x99, 0x8f,
	0x61, 0x03, 0x00, 0x00,
}
