// Copyright 2019 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/admob/v1/admob_api.proto

package admob

import (
	context "context"
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Request to retrieve the specified publisher account.
type GetPublisherAccountRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Resource name of the publisher account to retrieve.
	// Example: accounts/pub-9876543210987654
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

func (x *GetPublisherAccountRequest) Reset() {
	*x = GetPublisherAccountRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetPublisherAccountRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetPublisherAccountRequest) ProtoMessage() {}

func (x *GetPublisherAccountRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetPublisherAccountRequest.ProtoReflect.Descriptor instead.
func (*GetPublisherAccountRequest) Descriptor() ([]byte, []int) {
	return file_google_ads_admob_v1_admob_api_proto_rawDescGZIP(), []int{0}
}

func (x *GetPublisherAccountRequest) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

// Request to retrieve the AdMob publisher account accessible with the client
// credential. Currently all credentials have access to at most 1 account.
type ListPublisherAccountsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Maximum number of accounts to return.
	PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// The value returned by the last `ListPublisherAccountsResponse`; indicates
	// that this is a continuation of a prior `ListPublisherAccounts` call, and
	// that the system should return the next page of data.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
}

func (x *ListPublisherAccountsRequest) Reset() {
	*x = ListPublisherAccountsRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListPublisherAccountsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListPublisherAccountsRequest) ProtoMessage() {}

func (x *ListPublisherAccountsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListPublisherAccountsRequest.ProtoReflect.Descriptor instead.
func (*ListPublisherAccountsRequest) Descriptor() ([]byte, []int) {
	return file_google_ads_admob_v1_admob_api_proto_rawDescGZIP(), []int{1}
}

func (x *ListPublisherAccountsRequest) GetPageSize() int32 {
	if x != nil {
		return x.PageSize
	}
	return 0
}

func (x *ListPublisherAccountsRequest) GetPageToken() string {
	if x != nil {
		return x.PageToken
	}
	return ""
}

// Response for the publisher account list request.
type ListPublisherAccountsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Publisher that the client credentials can access.
	Account []*PublisherAccount `protobuf:"bytes,1,rep,name=account,proto3" json:"account,omitempty"`
	// If not empty, indicates that there might be more accounts for the request;
	// you must pass this value in a new `ListPublisherAccountsRequest`.
	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
}

func (x *ListPublisherAccountsResponse) Reset() {
	*x = ListPublisherAccountsResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListPublisherAccountsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListPublisherAccountsResponse) ProtoMessage() {}

func (x *ListPublisherAccountsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListPublisherAccountsResponse.ProtoReflect.Descriptor instead.
func (*ListPublisherAccountsResponse) Descriptor() ([]byte, []int) {
	return file_google_ads_admob_v1_admob_api_proto_rawDescGZIP(), []int{2}
}

func (x *ListPublisherAccountsResponse) GetAccount() []*PublisherAccount {
	if x != nil {
		return x.Account
	}
	return nil
}

func (x *ListPublisherAccountsResponse) GetNextPageToken() string {
	if x != nil {
		return x.NextPageToken
	}
	return ""
}

// Request to generate an AdMob Mediation report.
type GenerateMediationReportRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Resource name of the account to generate the report for.
	// Example: accounts/pub-9876543210987654
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Network report specification.
	ReportSpec *MediationReportSpec `protobuf:"bytes,2,opt,name=report_spec,json=reportSpec,proto3" json:"report_spec,omitempty"`
}

func (x *GenerateMediationReportRequest) Reset() {
	*x = GenerateMediationReportRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GenerateMediationReportRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GenerateMediationReportRequest) ProtoMessage() {}

func (x *GenerateMediationReportRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerateMediationReportRequest.ProtoReflect.Descriptor instead.
func (*GenerateMediationReportRequest) Descriptor() ([]byte, []int) {
	return file_google_ads_admob_v1_admob_api_proto_rawDescGZIP(), []int{3}
}

func (x *GenerateMediationReportRequest) GetParent() string {
	if x != nil {
		return x.Parent
	}
	return ""
}

func (x *GenerateMediationReportRequest) GetReportSpec() *MediationReportSpec {
	if x != nil {
		return x.ReportSpec
	}
	return nil
}

// The streaming response for the AdMob Mediation report where the first
// response contains the report header, then a stream of row responses, and
// finally a footer as the last response message.
//
// For example:
//
//     [{
//       "header": {
//         "date_range": {
//           "start_date": {"year": 2018, "month": 9, "day": 1},
//           "end_date": {"year": 2018, "month": 9, "day": 30}
//         }
//         "localization_settings": {
//           "currency_code": "USD",
//           "language_code": "en-US"
//         }
//       }
//     },
//     {
//       "row": {
//         "dimension_values": {
//           "DATE": {"value": "20180918"},
//           "APP": {
//             "value": "ca-app-pub-8123415297019784~1001342552",
//              "display_label": "My app name!"
//           }
//         },
//         "metric_values": {
//           "ESTIMATED_EARNINGS": {"decimal_value": "1324746"}
//         }
//       }
//     },
//     {
//       "footer": {"matching_row_count": 1}
//     }]
type GenerateMediationReportResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Each stream response message contains one type of payload.
	//
	// Types that are assignable to Payload:
	//	*GenerateMediationReportResponse_Header
	//	*GenerateMediationReportResponse_Row
	//	*GenerateMediationReportResponse_Footer
	Payload isGenerateMediationReportResponse_Payload `protobuf_oneof:"payload"`
}

func (x *GenerateMediationReportResponse) Reset() {
	*x = GenerateMediationReportResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GenerateMediationReportResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GenerateMediationReportResponse) ProtoMessage() {}

func (x *GenerateMediationReportResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerateMediationReportResponse.ProtoReflect.Descriptor instead.
func (*GenerateMediationReportResponse) Descriptor() ([]byte, []int) {
	return file_google_ads_admob_v1_admob_api_proto_rawDescGZIP(), []int{4}
}

func (m *GenerateMediationReportResponse) GetPayload() isGenerateMediationReportResponse_Payload {
	if m != nil {
		return m.Payload
	}
	return nil
}

func (x *GenerateMediationReportResponse) GetHeader() *ReportHeader {
	if x, ok := x.GetPayload().(*GenerateMediationReportResponse_Header); ok {
		return x.Header
	}
	return nil
}

func (x *GenerateMediationReportResponse) GetRow() *ReportRow {
	if x, ok := x.GetPayload().(*GenerateMediationReportResponse_Row); ok {
		return x.Row
	}
	return nil
}

func (x *GenerateMediationReportResponse) GetFooter() *ReportFooter {
	if x, ok := x.GetPayload().(*GenerateMediationReportResponse_Footer); ok {
		return x.Footer
	}
	return nil
}

type isGenerateMediationReportResponse_Payload interface {
	isGenerateMediationReportResponse_Payload()
}

type GenerateMediationReportResponse_Header struct {
	// Report generation settings that describes the report contents, such as
	// the report date range and localization settings.
	Header *ReportHeader `protobuf:"bytes,1,opt,name=header,proto3,oneof"`
}

type GenerateMediationReportResponse_Row struct {
	// Actual report data.
	Row *ReportRow `protobuf:"bytes,2,opt,name=row,proto3,oneof"`
}

type GenerateMediationReportResponse_Footer struct {
	// Additional information about the generated report, such as warnings about
	// the data.
	Footer *ReportFooter `protobuf:"bytes,3,opt,name=footer,proto3,oneof"`
}

func (*GenerateMediationReportResponse_Header) isGenerateMediationReportResponse_Payload() {}

func (*GenerateMediationReportResponse_Row) isGenerateMediationReportResponse_Payload() {}

func (*GenerateMediationReportResponse_Footer) isGenerateMediationReportResponse_Payload() {}

// Request to generate an AdMob Network report.
type GenerateNetworkReportRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Resource name of the account to generate the report for.
	// Example: accounts/pub-9876543210987654
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Network report specification.
	ReportSpec *NetworkReportSpec `protobuf:"bytes,2,opt,name=report_spec,json=reportSpec,proto3" json:"report_spec,omitempty"`
}

func (x *GenerateNetworkReportRequest) Reset() {
	*x = GenerateNetworkReportRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GenerateNetworkReportRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GenerateNetworkReportRequest) ProtoMessage() {}

func (x *GenerateNetworkReportRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerateNetworkReportRequest.ProtoReflect.Descriptor instead.
func (*GenerateNetworkReportRequest) Descriptor() ([]byte, []int) {
	return file_google_ads_admob_v1_admob_api_proto_rawDescGZIP(), []int{5}
}

func (x *GenerateNetworkReportRequest) GetParent() string {
	if x != nil {
		return x.Parent
	}
	return ""
}

func (x *GenerateNetworkReportRequest) GetReportSpec() *NetworkReportSpec {
	if x != nil {
		return x.ReportSpec
	}
	return nil
}

// The streaming response for the AdMob Network report where the first response
// contains the report header, then a stream of row responses, and finally a
// footer as the last response message.
//
// For example:
//
//     [{
//       "header": {
//         "dateRange": {
//           "startDate": {"year": 2018, "month": 9, "day": 1},
//           "endDate": {"year": 2018, "month": 9, "day": 30}
//         }
//         "localizationSettings": {
//           "currencyCode": "USD",
//           "languageCode": "en-US"
//         }
//       }
//     },
//     {
//       "row": {
//         "dimensionValues": {
//           "DATE": {"value": "20180918"},
//           "APP": {
//             "value": "ca-app-pub-8123415297019784~1001342552",
//              displayLabel: "My app name!"
//           }
//         },
//         "metricValues": {
//           "ESTIMATED_EARNINGS": {"microsValue": 6500000}
//         }
//       }
//     },
//     ...
//     {
//       "footer": {"matchingRowCount": 5}
//     }]
type GenerateNetworkReportResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Each stream response message contains one type of payload.
	//
	// Types that are assignable to Payload:
	//	*GenerateNetworkReportResponse_Header
	//	*GenerateNetworkReportResponse_Row
	//	*GenerateNetworkReportResponse_Footer
	Payload isGenerateNetworkReportResponse_Payload `protobuf_oneof:"payload"`
}

func (x *GenerateNetworkReportResponse) Reset() {
	*x = GenerateNetworkReportResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GenerateNetworkReportResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GenerateNetworkReportResponse) ProtoMessage() {}

func (x *GenerateNetworkReportResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_admob_v1_admob_api_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerateNetworkReportResponse.ProtoReflect.Descriptor instead.
func (*GenerateNetworkReportResponse) Descriptor() ([]byte, []int) {
	return file_google_ads_admob_v1_admob_api_proto_rawDescGZIP(), []int{6}
}

func (m *GenerateNetworkReportResponse) GetPayload() isGenerateNetworkReportResponse_Payload {
	if m != nil {
		return m.Payload
	}
	return nil
}

func (x *GenerateNetworkReportResponse) GetHeader() *ReportHeader {
	if x, ok := x.GetPayload().(*GenerateNetworkReportResponse_Header); ok {
		return x.Header
	}
	return nil
}

func (x *GenerateNetworkReportResponse) GetRow() *ReportRow {
	if x, ok := x.GetPayload().(*GenerateNetworkReportResponse_Row); ok {
		return x.Row
	}
	return nil
}

func (x *GenerateNetworkReportResponse) GetFooter() *ReportFooter {
	if x, ok := x.GetPayload().(*GenerateNetworkReportResponse_Footer); ok {
		return x.Footer
	}
	return nil
}

type isGenerateNetworkReportResponse_Payload interface {
	isGenerateNetworkReportResponse_Payload()
}

type GenerateNetworkReportResponse_Header struct {
	// Report generation settings that describes the report contents, such as
	// the report date range and localization settings.
	Header *ReportHeader `protobuf:"bytes,1,opt,name=header,proto3,oneof"`
}

type GenerateNetworkReportResponse_Row struct {
	// Actual report data.
	Row *ReportRow `protobuf:"bytes,2,opt,name=row,proto3,oneof"`
}

type GenerateNetworkReportResponse_Footer struct {
	// Additional information about the generated report, such as warnings about
	// the data.
	Footer *ReportFooter `protobuf:"bytes,3,opt,name=footer,proto3,oneof"`
}

func (*GenerateNetworkReportResponse_Header) isGenerateNetworkReportResponse_Payload() {}

func (*GenerateNetworkReportResponse_Row) isGenerateNetworkReportResponse_Payload() {}

func (*GenerateNetworkReportResponse_Footer) isGenerateNetworkReportResponse_Payload() {}

var File_google_ads_admob_v1_admob_api_proto protoreflect.FileDescriptor

var file_google_ads_admob_v1_admob_api_proto_rawDesc = []byte{
	0x0a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x61, 0x64, 0x6d,
	0x6f, 0x62, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x5f, 0x61, 0x70, 0x69, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64,
	0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x1a, 0x29, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2f, 0x76, 0x31, 0x2f,
	0x61, 0x64, 0x6d, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70,
	0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f,
	0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x30, 0x0a, 0x1a,
	0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f,
	0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a,
	0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41,
	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b,
	0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70,
	0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x88, 0x01, 0x0a, 0x1d, 0x4c,
	0x69, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f,
	0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07,
	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62,
	0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x63, 0x63,
	0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a,
	0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65,
	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x83, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
	0x74, 0x65, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72,
	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65,
	0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
	0x12, 0x49, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
	0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x64, 0x69,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52,
	0x0a, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x22, 0xda, 0x01, 0x0a, 0x1f,
	0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
	0x3b, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d,
	0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x65, 0x61, 0x64,
	0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x03,
	0x72, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e,
	0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x03, 0x72, 0x6f, 0x77,
	0x12, 0x3b, 0x0a, 0x06, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64,
	0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x6f,
	0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x42, 0x09, 0x0a,
	0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x7f, 0x0a, 0x1c, 0x47, 0x65, 0x6e, 0x65,
	0x72, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72,
	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65,
	0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
	0x12, 0x47, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
	0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77,
	0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x72,
	0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd8, 0x01, 0x0a, 0x1d, 0x47, 0x65,
	0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70,
	0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x68,
	0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76,
	0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00,
	0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x03, 0x72, 0x6f, 0x77, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
	0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f,
	0x72, 0x74, 0x52, 0x6f, 0x77, 0x48, 0x00, 0x52, 0x03, 0x72, 0x6f, 0x77, 0x12, 0x3b, 0x0a, 0x06,
	0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e,
	0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x48,
	0x00, 0x52, 0x06, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79,
	0x6c, 0x6f, 0x61, 0x64, 0x32, 0xcd, 0x05, 0x0a, 0x08, 0x41, 0x64, 0x4d, 0x6f, 0x62, 0x41, 0x70,
	0x69, 0x12, 0x8c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
	0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e,
	0x47, 0x65, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f,
	0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31,
	0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
	0x74, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x7b,
	0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d,
	0x12, 0x94, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
	0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31,
	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x63,
	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62,
	0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65,
	0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x61,
	0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0xbb, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65,
	0x72, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72,
	0x74, 0x12, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61,
	0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
	0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64,
	0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72,
	0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33,
	0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x61, 0x63,
	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72,
	0x6b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
	0x3a, 0x01, 0x2a, 0x30, 0x01, 0x12, 0xc3, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
	0x74, 0x65, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72,
	0x74, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61,
	0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
	0x4d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e,
	0x65, 0x72, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
	0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3,
	0xe4, 0x93, 0x02, 0x35, 0x22, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e,
	0x74, 0x3d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x65,
	0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x3a, 0x67, 0x65,
	0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x30, 0x01, 0x1a, 0x17, 0xca, 0x41, 0x14,
	0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,
	0x2e, 0x63, 0x6f, 0x6d, 0x42, 0x62, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2e, 0x76, 0x31, 0x42,
	0x0d, 0x41, 0x64, 0x4d, 0x6f, 0x62, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x38,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x2f,
	0x76, 0x31, 0x3b, 0x61, 0x64, 0x6d, 0x6f, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_admob_v1_admob_api_proto_rawDescOnce sync.Once
	file_google_ads_admob_v1_admob_api_proto_rawDescData = file_google_ads_admob_v1_admob_api_proto_rawDesc
)

func file_google_ads_admob_v1_admob_api_proto_rawDescGZIP() []byte {
	file_google_ads_admob_v1_admob_api_proto_rawDescOnce.Do(func() {
		file_google_ads_admob_v1_admob_api_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_admob_v1_admob_api_proto_rawDescData)
	})
	return file_google_ads_admob_v1_admob_api_proto_rawDescData
}

var file_google_ads_admob_v1_admob_api_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_google_ads_admob_v1_admob_api_proto_goTypes = []interface{}{
	(*GetPublisherAccountRequest)(nil),      // 0: google.ads.admob.v1.GetPublisherAccountRequest
	(*ListPublisherAccountsRequest)(nil),    // 1: google.ads.admob.v1.ListPublisherAccountsRequest
	(*ListPublisherAccountsResponse)(nil),   // 2: google.ads.admob.v1.ListPublisherAccountsResponse
	(*GenerateMediationReportRequest)(nil),  // 3: google.ads.admob.v1.GenerateMediationReportRequest
	(*GenerateMediationReportResponse)(nil), // 4: google.ads.admob.v1.GenerateMediationReportResponse
	(*GenerateNetworkReportRequest)(nil),    // 5: google.ads.admob.v1.GenerateNetworkReportRequest
	(*GenerateNetworkReportResponse)(nil),   // 6: google.ads.admob.v1.GenerateNetworkReportResponse
	(*PublisherAccount)(nil),                // 7: google.ads.admob.v1.PublisherAccount
	(*MediationReportSpec)(nil),             // 8: google.ads.admob.v1.MediationReportSpec
	(*ReportHeader)(nil),                    // 9: google.ads.admob.v1.ReportHeader
	(*ReportRow)(nil),                       // 10: google.ads.admob.v1.ReportRow
	(*ReportFooter)(nil),                    // 11: google.ads.admob.v1.ReportFooter
	(*NetworkReportSpec)(nil),               // 12: google.ads.admob.v1.NetworkReportSpec
}
var file_google_ads_admob_v1_admob_api_proto_depIdxs = []int32{
	7,  // 0: google.ads.admob.v1.ListPublisherAccountsResponse.account:type_name -> google.ads.admob.v1.PublisherAccount
	8,  // 1: google.ads.admob.v1.GenerateMediationReportRequest.report_spec:type_name -> google.ads.admob.v1.MediationReportSpec
	9,  // 2: google.ads.admob.v1.GenerateMediationReportResponse.header:type_name -> google.ads.admob.v1.ReportHeader
	10, // 3: google.ads.admob.v1.GenerateMediationReportResponse.row:type_name -> google.ads.admob.v1.ReportRow
	11, // 4: google.ads.admob.v1.GenerateMediationReportResponse.footer:type_name -> google.ads.admob.v1.ReportFooter
	12, // 5: google.ads.admob.v1.GenerateNetworkReportRequest.report_spec:type_name -> google.ads.admob.v1.NetworkReportSpec
	9,  // 6: google.ads.admob.v1.GenerateNetworkReportResponse.header:type_name -> google.ads.admob.v1.ReportHeader
	10, // 7: google.ads.admob.v1.GenerateNetworkReportResponse.row:type_name -> google.ads.admob.v1.ReportRow
	11, // 8: google.ads.admob.v1.GenerateNetworkReportResponse.footer:type_name -> google.ads.admob.v1.ReportFooter
	0,  // 9: google.ads.admob.v1.AdMobApi.GetPublisherAccount:input_type -> google.ads.admob.v1.GetPublisherAccountRequest
	1,  // 10: google.ads.admob.v1.AdMobApi.ListPublisherAccounts:input_type -> google.ads.admob.v1.ListPublisherAccountsRequest
	5,  // 11: google.ads.admob.v1.AdMobApi.GenerateNetworkReport:input_type -> google.ads.admob.v1.GenerateNetworkReportRequest
	3,  // 12: google.ads.admob.v1.AdMobApi.GenerateMediationReport:input_type -> google.ads.admob.v1.GenerateMediationReportRequest
	7,  // 13: google.ads.admob.v1.AdMobApi.GetPublisherAccount:output_type -> google.ads.admob.v1.PublisherAccount
	2,  // 14: google.ads.admob.v1.AdMobApi.ListPublisherAccounts:output_type -> google.ads.admob.v1.ListPublisherAccountsResponse
	6,  // 15: google.ads.admob.v1.AdMobApi.GenerateNetworkReport:output_type -> google.ads.admob.v1.GenerateNetworkReportResponse
	4,  // 16: google.ads.admob.v1.AdMobApi.GenerateMediationReport:output_type -> google.ads.admob.v1.GenerateMediationReportResponse
	13, // [13:17] is the sub-list for method output_type
	9,  // [9:13] is the sub-list for method input_type
	9,  // [9:9] is the sub-list for extension type_name
	9,  // [9:9] is the sub-list for extension extendee
	0,  // [0:9] is the sub-list for field type_name
}

func init() { file_google_ads_admob_v1_admob_api_proto_init() }
func file_google_ads_admob_v1_admob_api_proto_init() {
	if File_google_ads_admob_v1_admob_api_proto != nil {
		return
	}
	file_google_ads_admob_v1_admob_resources_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_google_ads_admob_v1_admob_api_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetPublisherAccountRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_ads_admob_v1_admob_api_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListPublisherAccountsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_ads_admob_v1_admob_api_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListPublisherAccountsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_ads_admob_v1_admob_api_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateMediationReportRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_ads_admob_v1_admob_api_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateMediationReportResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_ads_admob_v1_admob_api_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateNetworkReportRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_ads_admob_v1_admob_api_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateNetworkReportResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_ads_admob_v1_admob_api_proto_msgTypes[4].OneofWrappers = []interface{}{
		(*GenerateMediationReportResponse_Header)(nil),
		(*GenerateMediationReportResponse_Row)(nil),
		(*GenerateMediationReportResponse_Footer)(nil),
	}
	file_google_ads_admob_v1_admob_api_proto_msgTypes[6].OneofWrappers = []interface{}{
		(*GenerateNetworkReportResponse_Header)(nil),
		(*GenerateNetworkReportResponse_Row)(nil),
		(*GenerateNetworkReportResponse_Footer)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_admob_v1_admob_api_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   7,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_google_ads_admob_v1_admob_api_proto_goTypes,
		DependencyIndexes: file_google_ads_admob_v1_admob_api_proto_depIdxs,
		MessageInfos:      file_google_ads_admob_v1_admob_api_proto_msgTypes,
	}.Build()
	File_google_ads_admob_v1_admob_api_proto = out.File
	file_google_ads_admob_v1_admob_api_proto_rawDesc = nil
	file_google_ads_admob_v1_admob_api_proto_goTypes = nil
	file_google_ads_admob_v1_admob_api_proto_depIdxs = nil
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// AdMobApiClient is the client API for AdMobApi service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type AdMobApiClient interface {
	// Gets information about the specified AdMob publisher account.
	GetPublisherAccount(ctx context.Context, in *GetPublisherAccountRequest, opts ...grpc.CallOption) (*PublisherAccount, error)
	// Lists the AdMob publisher account accessible with the client credential.
	// Currently, all credentials have access to at most one AdMob account.
	ListPublisherAccounts(ctx context.Context, in *ListPublisherAccountsRequest, opts ...grpc.CallOption) (*ListPublisherAccountsResponse, error)
	// Generates an AdMob Network report based on the provided report
	// specification.
	GenerateNetworkReport(ctx context.Context, in *GenerateNetworkReportRequest, opts ...grpc.CallOption) (AdMobApi_GenerateNetworkReportClient, error)
	// Generates an AdMob Mediation report based on the provided report
	// specification.
	GenerateMediationReport(ctx context.Context, in *GenerateMediationReportRequest, opts ...grpc.CallOption) (AdMobApi_GenerateMediationReportClient, error)
}

type adMobApiClient struct {
	cc grpc.ClientConnInterface
}

func NewAdMobApiClient(cc grpc.ClientConnInterface) AdMobApiClient {
	return &adMobApiClient{cc}
}

func (c *adMobApiClient) GetPublisherAccount(ctx context.Context, in *GetPublisherAccountRequest, opts ...grpc.CallOption) (*PublisherAccount, error) {
	out := new(PublisherAccount)
	err := c.cc.Invoke(ctx, "/google.ads.admob.v1.AdMobApi/GetPublisherAccount", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *adMobApiClient) ListPublisherAccounts(ctx context.Context, in *ListPublisherAccountsRequest, opts ...grpc.CallOption) (*ListPublisherAccountsResponse, error) {
	out := new(ListPublisherAccountsResponse)
	err := c.cc.Invoke(ctx, "/google.ads.admob.v1.AdMobApi/ListPublisherAccounts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *adMobApiClient) GenerateNetworkReport(ctx context.Context, in *GenerateNetworkReportRequest, opts ...grpc.CallOption) (AdMobApi_GenerateNetworkReportClient, error) {
	stream, err := c.cc.NewStream(ctx, &_AdMobApi_serviceDesc.Streams[0], "/google.ads.admob.v1.AdMobApi/GenerateNetworkReport", opts...)
	if err != nil {
		return nil, err
	}
	x := &adMobApiGenerateNetworkReportClient{stream}
	if err := x.ClientStream.SendMsg(in); err != nil {
		return nil, err
	}
	if err := x.ClientStream.CloseSend(); err != nil {
		return nil, err
	}
	return x, nil
}

type AdMobApi_GenerateNetworkReportClient interface {
	Recv() (*GenerateNetworkReportResponse, error)
	grpc.ClientStream
}

type adMobApiGenerateNetworkReportClient struct {
	grpc.ClientStream
}

func (x *adMobApiGenerateNetworkReportClient) Recv() (*GenerateNetworkReportResponse, error) {
	m := new(GenerateNetworkReportResponse)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

func (c *adMobApiClient) GenerateMediationReport(ctx context.Context, in *GenerateMediationReportRequest, opts ...grpc.CallOption) (AdMobApi_GenerateMediationReportClient, error) {
	stream, err := c.cc.NewStream(ctx, &_AdMobApi_serviceDesc.Streams[1], "/google.ads.admob.v1.AdMobApi/GenerateMediationReport", opts...)
	if err != nil {
		return nil, err
	}
	x := &adMobApiGenerateMediationReportClient{stream}
	if err := x.ClientStream.SendMsg(in); err != nil {
		return nil, err
	}
	if err := x.ClientStream.CloseSend(); err != nil {
		return nil, err
	}
	return x, nil
}

type AdMobApi_GenerateMediationReportClient interface {
	Recv() (*GenerateMediationReportResponse, error)
	grpc.ClientStream
}

type adMobApiGenerateMediationReportClient struct {
	grpc.ClientStream
}

func (x *adMobApiGenerateMediationReportClient) Recv() (*GenerateMediationReportResponse, error) {
	m := new(GenerateMediationReportResponse)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

// AdMobApiServer is the server API for AdMobApi service.
type AdMobApiServer interface {
	// Gets information about the specified AdMob publisher account.
	GetPublisherAccount(context.Context, *GetPublisherAccountRequest) (*PublisherAccount, error)
	// Lists the AdMob publisher account accessible with the client credential.
	// Currently, all credentials have access to at most one AdMob account.
	ListPublisherAccounts(context.Context, *ListPublisherAccountsRequest) (*ListPublisherAccountsResponse, error)
	// Generates an AdMob Network report based on the provided report
	// specification.
	GenerateNetworkReport(*GenerateNetworkReportRequest, AdMobApi_GenerateNetworkReportServer) error
	// Generates an AdMob Mediation report based on the provided report
	// specification.
	GenerateMediationReport(*GenerateMediationReportRequest, AdMobApi_GenerateMediationReportServer) error
}

// UnimplementedAdMobApiServer can be embedded to have forward compatible implementations.
type UnimplementedAdMobApiServer struct {
}

func (*UnimplementedAdMobApiServer) GetPublisherAccount(context.Context, *GetPublisherAccountRequest) (*PublisherAccount, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetPublisherAccount not implemented")
}
func (*UnimplementedAdMobApiServer) ListPublisherAccounts(context.Context, *ListPublisherAccountsRequest) (*ListPublisherAccountsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ListPublisherAccounts not implemented")
}
func (*UnimplementedAdMobApiServer) GenerateNetworkReport(*GenerateNetworkReportRequest, AdMobApi_GenerateNetworkReportServer) error {
	return status.Errorf(codes.Unimplemented, "method GenerateNetworkReport not implemented")
}
func (*UnimplementedAdMobApiServer) GenerateMediationReport(*GenerateMediationReportRequest, AdMobApi_GenerateMediationReportServer) error {
	return status.Errorf(codes.Unimplemented, "method GenerateMediationReport not implemented")
}

func RegisterAdMobApiServer(s *grpc.Server, srv AdMobApiServer) {
	s.RegisterService(&_AdMobApi_serviceDesc, srv)
}

func _AdMobApi_GetPublisherAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetPublisherAccountRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(AdMobApiServer).GetPublisherAccount(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.admob.v1.AdMobApi/GetPublisherAccount",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(AdMobApiServer).GetPublisherAccount(ctx, req.(*GetPublisherAccountRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _AdMobApi_ListPublisherAccounts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListPublisherAccountsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(AdMobApiServer).ListPublisherAccounts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.admob.v1.AdMobApi/ListPublisherAccounts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(AdMobApiServer).ListPublisherAccounts(ctx, req.(*ListPublisherAccountsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _AdMobApi_GenerateNetworkReport_Handler(srv interface{}, stream grpc.ServerStream) error {
	m := new(GenerateNetworkReportRequest)
	if err := stream.RecvMsg(m); err != nil {
		return err
	}
	return srv.(AdMobApiServer).GenerateNetworkReport(m, &adMobApiGenerateNetworkReportServer{stream})
}

type AdMobApi_GenerateNetworkReportServer interface {
	Send(*GenerateNetworkReportResponse) error
	grpc.ServerStream
}

type adMobApiGenerateNetworkReportServer struct {
	grpc.ServerStream
}

func (x *adMobApiGenerateNetworkReportServer) Send(m *GenerateNetworkReportResponse) error {
	return x.ServerStream.SendMsg(m)
}

func _AdMobApi_GenerateMediationReport_Handler(srv interface{}, stream grpc.ServerStream) error {
	m := new(GenerateMediationReportRequest)
	if err := stream.RecvMsg(m); err != nil {
		return err
	}
	return srv.(AdMobApiServer).GenerateMediationReport(m, &adMobApiGenerateMediationReportServer{stream})
}

type AdMobApi_GenerateMediationReportServer interface {
	Send(*GenerateMediationReportResponse) error
	grpc.ServerStream
}

type adMobApiGenerateMediationReportServer struct {
	grpc.ServerStream
}

func (x *adMobApiGenerateMediationReportServer) Send(m *GenerateMediationReportResponse) error {
	return x.ServerStream.SendMsg(m)
}

var _AdMobApi_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.admob.v1.AdMobApi",
	HandlerType: (*AdMobApiServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetPublisherAccount",
			Handler:    _AdMobApi_GetPublisherAccount_Handler,
		},
		{
			MethodName: "ListPublisherAccounts",
			Handler:    _AdMobApi_ListPublisherAccounts_Handler,
		},
	},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "GenerateNetworkReport",
			Handler:       _AdMobApi_GenerateNetworkReport_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "GenerateMediationReport",
			Handler:       _AdMobApi_GenerateMediationReport_Handler,
			ServerStreams: true,
		},
	},
	Metadata: "google/ads/admob/v1/admob_api.proto",
}
