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

package resources

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

// A Keyword Planner ad group.
// Max number of keyword plan ad groups per plan: 200.
type KeywordPlanAdGroup struct {
	// Immutable. The resource name of the Keyword Planner ad group.
	// KeywordPlanAdGroup resource names have the form:
	//
	// `customers/{customer_id}/keywordPlanAdGroups/{kp_ad_group_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The keyword plan campaign to which this ad group belongs.
	KeywordPlanCampaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=keyword_plan_campaign,json=keywordPlanCampaign,proto3" json:"keyword_plan_campaign,omitempty"`
	// Output only. The ID of the keyword plan ad group.
	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// The name of the keyword plan ad group.
	//
	// This field is required and should not be empty when creating keyword plan
	// ad group.
	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// A default ad group max cpc bid in micros in account currency for all
	// biddable keywords under the keyword plan ad group.
	// If not set, will inherit from parent campaign.
	CpcBidMicros         *wrappers.Int64Value `protobuf:"bytes,5,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_KeywordPlanAdGroup proto.InternalMessageInfo

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

func (m *KeywordPlanAdGroup) GetKeywordPlanCampaign() *wrappers.StringValue {
	if m != nil {
		return m.KeywordPlanCampaign
	}
	return nil
}

func (m *KeywordPlanAdGroup) GetId() *wrappers.Int64Value {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *KeywordPlanAdGroup) GetName() *wrappers.StringValue {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *KeywordPlanAdGroup) GetCpcBidMicros() *wrappers.Int64Value {
	if m != nil {
		return m.CpcBidMicros
	}
	return nil
}

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

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

var fileDescriptor_8bbe0859e53aefdd = []byte{
	// 490 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4d, 0x6b, 0x14, 0x31,
	0x18, 0x66, 0x66, 0x5b, 0xc1, 0x58, 0x3d, 0x8c, 0x88, 0x6b, 0x2d, 0xda, 0x0a, 0x85, 0x82, 0x9a,
	0x54, 0x47, 0x3c, 0x8c, 0x08, 0x66, 0x3c, 0x2c, 0x2a, 0xca, 0x32, 0xc2, 0x22, 0xb2, 0x30, 0x64,
	0x93, 0x34, 0x86, 0x9d, 0x49, 0x42, 0x32, 0xb3, 0x45, 0x4a, 0x4f, 0x7a, 0xf7, 0x3f, 0x78, 0xf4,
	0xa7, 0xf8, 0x2b, 0x7a, 0xee, 0x4f, 0xe8, 0x49, 0x76, 0xbe, 0x5a, 0x19, 0x71, 0xf5, 0xf6, 0xec,
	0xbe, 0xcf, 0xc7, 0xfb, 0xbc, 0x64, 0xc0, 0x73, 0xa1, 0xb5, 0xc8, 0x38, 0x22, 0xcc, 0xa1, 0x1a,
	0x2e, 0xd1, 0x22, 0x44, 0x96, 0x3b, 0x5d, 0x5a, 0xca, 0x1d, 0x9a, 0xf3, 0xcf, 0x87, 0xda, 0xb2,
	0xd4, 0x64, 0x44, 0xa5, 0x84, 0xa5, 0xc2, 0xea, 0xd2, 0x40, 0x63, 0x75, 0xa1, 0x83, 0x9d, 0x5a,
	0x03, 0x09, 0x73, 0xb0, 0x93, 0xc3, 0x45, 0x08, 0x3b, 0xf9, 0xe6, 0xdd, 0x36, 0xc1, 0x48, 0x74,
	0x20, 0x79, 0xc6, 0xd2, 0x19, 0xff, 0x44, 0x16, 0x52, 0xdb, 0xda, 0x63, 0xf3, 0xd6, 0x05, 0x42,
	0x2b, 0x6b, 0x46, 0x77, 0x9a, 0x51, 0xf5, 0x6b, 0x56, 0x1e, 0xa0, 0x43, 0x4b, 0x8c, 0xe1, 0xd6,
	0x35, 0xf3, 0xad, 0x0b, 0x52, 0xa2, 0x94, 0x2e, 0x48, 0x21, 0xb5, 0x6a, 0xa6, 0xf7, 0xbe, 0xad,
	0x81, 0xe0, 0x4d, 0xbd, 0xfc, 0x38, 0x23, 0x0a, 0xb3, 0xd1, 0x72, 0xf3, 0xe0, 0x03, 0xb8, 0xda,
	0xc6, 0xa4, 0x8a, 0xe4, 0x7c, 0xe8, 0x6d, 0x7b, 0x7b, 0x97, 0xe3, 0xf0, 0x04, 0xaf, 0x9f, 0xe1,
	0x87, 0xe0, 0xfe, 0x79, 0x8f, 0x06, 0x19, 0xe9, 0x20, 0xd5, 0x39, 0xea, 0x7b, 0x25, 0x1b, 0xad,
	0xd3, 0x3b, 0x92, 0xf3, 0xe0, 0x8b, 0x07, 0x6e, 0xfc, 0x76, 0x2d, 0x4a, 0x72, 0x43, 0xa4, 0x50,
	0x43, 0x7f, 0xdb, 0xdb, 0xbb, 0xf2, 0x78, 0xab, 0x71, 0x84, 0x6d, 0x1f, 0xf8, 0xbe, 0xb0, 0x52,
	0x89, 0x09, 0xc9, 0x4a, 0x1e, 0x3f, 0x3a, 0xc3, 0x10, 0x3c, 0xf8, 0x97, 0xf4, 0x97, 0x8d, 0x6d,
	0x72, 0x7d, 0xde, 0xff, 0x33, 0xd8, 0x07, 0xbe, 0x64, 0xc3, 0x41, 0x95, 0x78, 0xbb, 0x97, 0xf8,
	0x4a, 0x15, 0x4f, 0x9f, 0xd4, 0x81, 0x83, 0x13, 0x3c, 0x48, 0x7c, 0xc9, 0x82, 0x7d, 0xb0, 0x56,
	0x1d, 0x62, 0x6d, 0xf5, 0x96, 0x49, 0xc5, 0x0c, 0x30, 0xb8, 0x46, 0x0d, 0x4d, 0x67, 0x92, 0xa5,
	0xb9, 0xa4, 0x56, 0xbb, 0xe1, 0xfa, 0xca, 0xbc, 0x64, 0x83, 0x1a, 0x1a, 0x4b, 0xf6, 0xb6, 0x12,
	0x44, 0xf6, 0x14, 0xeb, 0xff, 0x3a, 0x76, 0xf0, 0x82, 0x96, 0xae, 0xd0, 0x39, 0xb7, 0x0e, 0x1d,
	0xb5, 0xf0, 0x18, 0xcd, 0x7b, 0x44, 0x87, 0x8e, 0xfe, 0xf8, 0x66, 0x8f, 0xe3, 0xaf, 0x3e, 0xd8,
	0xa5, 0x3a, 0x87, 0x2b, 0x5f, 0x6d, 0x7c, 0xb3, 0x9f, 0x3f, 0x5e, 0x56, 0x1a, 0x7b, 0x1f, 0x5f,
	0x37, 0x6a, 0xa1, 0x33, 0xa2, 0x04, 0xd4, 0x56, 0x20, 0xc1, 0x55, 0x55, 0x18, 0x9d, 0x97, 0xf8,
	0xcb, 0x17, 0xf5, 0xac, 0x43, 0xdf, 0xfd, 0xc1, 0x08, 0xe3, 0x1f, 0xfe, 0xce, 0xa8, 0xb6, 0xc4,
	0xcc, 0xc1, 0x1a, 0x2e, 0xd1, 0x24, 0x84, 0x49, 0xcb, 0xfc, 0xd9, 0x72, 0xa6, 0x98, 0xb9, 0x69,
	0xc7, 0x99, 0x4e, 0xc2, 0x69, 0xc7, 0x39, 0xf5, 0x77, 0xeb, 0x41, 0x14, 0x61, 0xe6, 0xa2, 0xa8,
	0x63, 0x45, 0xd1, 0x24, 0x8c, 0xa2, 0x8e, 0x37, 0xbb, 0x54, 0x2d, 0x1b, 0xfe, 0x0a, 0x00, 0x00,
	0xff, 0xff, 0x91, 0x4e, 0x07, 0x3f, 0xfd, 0x03, 0x00, 0x00,
}
