// Copyright 2020 Google LLC.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated file. DO NOT EDIT.

// Package doubleclickbidmanager provides access to the DoubleClick Bid Manager API.
//
// For product documentation, see: https://developers.google.com/bid-manager/
//
// Creating a client
//
// Usage example:
//
//   import "google.golang.org/api/doubleclickbidmanager/v1.1"
//   ...
//   ctx := context.Background()
//   doubleclickbidmanagerService, err := doubleclickbidmanager.NewService(ctx)
//
// In this example, Google Application Default Credentials are used for authentication.
//
// For information on how to create and obtain Application Default Credentials, see https://developers.google.com/identity/protocols/application-default-credentials.
//
// Other authentication options
//
// To use an API key for authentication (note: some APIs do not support API keys), use option.WithAPIKey:
//
//   doubleclickbidmanagerService, err := doubleclickbidmanager.NewService(ctx, option.WithAPIKey("AIza..."))
//
// To use an OAuth token (e.g., a user token obtained via a three-legged OAuth flow), use option.WithTokenSource:
//
//   config := &oauth2.Config{...}
//   // ...
//   token, err := config.Exchange(ctx, ...)
//   doubleclickbidmanagerService, err := doubleclickbidmanager.NewService(ctx, option.WithTokenSource(config.TokenSource(ctx, token)))
//
// See https://godoc.org/google.golang.org/api/option/ for details on options.
package doubleclickbidmanager // import "google.golang.org/api/doubleclickbidmanager/v1.1"

import (
	"bytes"
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"strconv"
	"strings"

	googleapi "google.golang.org/api/googleapi"
	gensupport "google.golang.org/api/internal/gensupport"
	option "google.golang.org/api/option"
	internaloption "google.golang.org/api/option/internaloption"
	htransport "google.golang.org/api/transport/http"
)

// Always reference these packages, just in case the auto-generated code
// below doesn't.
var _ = bytes.NewBuffer
var _ = strconv.Itoa
var _ = fmt.Sprintf
var _ = json.NewDecoder
var _ = io.Copy
var _ = url.Parse
var _ = gensupport.MarshalJSON
var _ = googleapi.Version
var _ = errors.New
var _ = strings.Replace
var _ = context.Canceled
var _ = internaloption.WithDefaultEndpoint

const apiId = "doubleclickbidmanager:v1.1"
const apiName = "doubleclickbidmanager"
const apiVersion = "v1.1"
const basePath = "https://www.googleapis.com/"
const mtlsBasePath = "https://www.mtls.googleapis.com/"

// OAuth2 scopes used by this API.
const (
	// View and manage your reports in DoubleClick Bid Manager
	DoubleclickbidmanagerScope = "https://www.googleapis.com/auth/doubleclickbidmanager"
)

// NewService creates a new Service.
func NewService(ctx context.Context, opts ...option.ClientOption) (*Service, error) {
	scopesOption := option.WithScopes(
		"https://www.googleapis.com/auth/doubleclickbidmanager",
	)
	// NOTE: prepend, so we don't override user-specified scopes.
	opts = append([]option.ClientOption{scopesOption}, opts...)
	opts = append(opts, internaloption.WithDefaultEndpoint(basePath))
	opts = append(opts, internaloption.WithDefaultMTLSEndpoint(mtlsBasePath))
	client, endpoint, err := htransport.NewClient(ctx, opts...)
	if err != nil {
		return nil, err
	}
	s, err := New(client)
	if err != nil {
		return nil, err
	}
	if endpoint != "" {
		s.BasePath = endpoint
	}
	return s, nil
}

// New creates a new Service. It uses the provided http.Client for requests.
//
// Deprecated: please use NewService instead.
// To provide a custom HTTP client, use option.WithHTTPClient.
// If you are using google.golang.org/api/googleapis/transport.APIKey, use option.WithAPIKey with NewService instead.
func New(client *http.Client) (*Service, error) {
	if client == nil {
		return nil, errors.New("client is nil")
	}
	s := &Service{client: client, BasePath: basePath}
	s.Lineitems = NewLineitemsService(s)
	s.Queries = NewQueriesService(s)
	s.Reports = NewReportsService(s)
	s.Sdf = NewSdfService(s)
	return s, nil
}

type Service struct {
	client    *http.Client
	BasePath  string // API endpoint base URL
	UserAgent string // optional additional User-Agent fragment

	Lineitems *LineitemsService

	Queries *QueriesService

	Reports *ReportsService

	Sdf *SdfService
}

func (s *Service) userAgent() string {
	if s.UserAgent == "" {
		return googleapi.UserAgent
	}
	return googleapi.UserAgent + " " + s.UserAgent
}

func NewLineitemsService(s *Service) *LineitemsService {
	rs := &LineitemsService{s: s}
	return rs
}

type LineitemsService struct {
	s *Service
}

func NewQueriesService(s *Service) *QueriesService {
	rs := &QueriesService{s: s}
	return rs
}

type QueriesService struct {
	s *Service
}

func NewReportsService(s *Service) *ReportsService {
	rs := &ReportsService{s: s}
	return rs
}

type ReportsService struct {
	s *Service
}

func NewSdfService(s *Service) *SdfService {
	rs := &SdfService{s: s}
	return rs
}

type SdfService struct {
	s *Service
}

// ChannelGrouping: A channel grouping defines a set of rules that can
// be used to categorize
// events in a path report.
type ChannelGrouping struct {
	// FallbackName: The name to apply to an event that does not match any
	// of the rules in the
	// channel grouping.
	FallbackName string `json:"fallbackName,omitempty"`

	// Name: Channel Grouping name.
	Name string `json:"name,omitempty"`

	// Rules: Rules within Channel Grouping. There is a limit of 100 rules
	// that can be
	// set per channel grouping.
	Rules []*Rule `json:"rules,omitempty"`

	// ForceSendFields is a list of field names (e.g. "FallbackName") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "FallbackName") to include
	// in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. However, any field with
	// an empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ChannelGrouping) MarshalJSON() ([]byte, error) {
	type NoMethod ChannelGrouping
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// DisjunctiveMatchStatement: DisjunctiveMatchStatement that OR's all
// contained filters.
type DisjunctiveMatchStatement struct {
	// EventFilters: Filters. There is a limit of 100 filters that can be
	// set per disjunctive
	// match statement.
	EventFilters []*EventFilter `json:"eventFilters,omitempty"`

	// ForceSendFields is a list of field names (e.g. "EventFilters") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "EventFilters") to include
	// in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. However, any field with
	// an empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *DisjunctiveMatchStatement) MarshalJSON() ([]byte, error) {
	type NoMethod DisjunctiveMatchStatement
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// DownloadLineItemsRequest: Request to fetch stored line items.
type DownloadLineItemsRequest struct {
	// FileSpec: File specification (column names, types, order) in which
	// the line items
	// will be returned. Default to <code>EWF</code>.
	//
	// Possible values:
	//   "EWF"
	FileSpec string `json:"fileSpec,omitempty"`

	// FilterIds: Ids of the specified filter type used to filter line items
	// to fetch. If
	// omitted, all the line items will be returned.
	FilterIds googleapi.Int64s `json:"filterIds,omitempty"`

	// FilterType: Filter type used to filter line items to fetch.
	//
	// Possible values:
	//   "ADVERTISER_ID"
	//   "INSERTION_ORDER_ID"
	//   "LINE_ITEM_ID"
	FilterType string `json:"filterType,omitempty"`

	// Format: Format in which the line items will be returned. Default
	// to
	// <code>CSV</code>.
	//
	// Possible values:
	//   "CSV"
	Format string `json:"format,omitempty"`

	// ForceSendFields is a list of field names (e.g. "FileSpec") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "FileSpec") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *DownloadLineItemsRequest) MarshalJSON() ([]byte, error) {
	type NoMethod DownloadLineItemsRequest
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// DownloadLineItemsResponse: Download line items response.
type DownloadLineItemsResponse struct {
	// LineItems: Retrieved line items in CSV format. For more information
	// about file
	// formats, see
	// <a
	// href="https://developers.google.com/bid-manager/guides/entity-write
	// /format">
	// Entity Write File Format</a>.
	LineItems string `json:"lineItems,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the
	// server.
	googleapi.ServerResponse `json:"-"`

	// ForceSendFields is a list of field names (e.g. "LineItems") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "LineItems") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *DownloadLineItemsResponse) MarshalJSON() ([]byte, error) {
	type NoMethod DownloadLineItemsResponse
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// DownloadRequest: Request to fetch stored inventory sources,
// campaigns, insertion orders, line
// items, YouTube ad groups and ads.
type DownloadRequest struct {
	// FileTypes: File types that will be returned. If INVENTORY_SOURCE is
	// requested, no
	// other file types may be requested. <br><br>Acceptable values are:
	// <ul>
	// <li>"<code>AD</code>"</li>
	// <li>"<code>AD_GROUP</code>"</li>
	// <li>"<code>CAMPAIGN</code>"</li>
	// <li>"<code>INSERTION_ORDER</code>"</li>
	// <li>"<code>INVENTORY_SOURCE</c
	// ode>"</li> <li>"<code>LINE_ITEM</code>"</li>
	// </ul>
	//
	// Possible values:
	//   "INSERTION_ORDER"
	//   "LINE_ITEM"
	//   "AD_GROUP"
	//   "AD"
	//   "CAMPAIGN"
	//   "INVENTORY_SOURCE"
	FileTypes []string `json:"fileTypes,omitempty"`

	// FilterIds: The IDs of the specified filter type. This is used to
	// filter entities to
	// fetch. At least one ID must be specified.
	FilterIds googleapi.Int64s `json:"filterIds,omitempty"`

	// FilterType: Filter type used to filter entities to fetch. PARTNER_ID
	// and
	// INVENTORY_SOURCE_ID may only be used when downloading inventory
	// sources.
	//
	// Possible values:
	//   "ADVERTISER_ID"
	//   "INSERTION_ORDER_ID"
	//   "LINE_ITEM_ID"
	//   "CAMPAIGN_ID"
	//   "INVENTORY_SOURCE_ID"
	//   "PARTNER_ID"
	FilterType string `json:"filterType,omitempty"`

	// Version: SDF Version (column names, types, order) in which the
	// entities will be
	// returned. Default to <code>5</code>.
	Version string `json:"version,omitempty"`

	// ForceSendFields is a list of field names (e.g. "FileTypes") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "FileTypes") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *DownloadRequest) MarshalJSON() ([]byte, error) {
	type NoMethod DownloadRequest
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// DownloadResponse: Download response.
type DownloadResponse struct {
	// AdGroups: Retrieved ad groups in SDF format.
	AdGroups string `json:"adGroups,omitempty"`

	// Ads: Retrieved ads in SDF format.
	Ads string `json:"ads,omitempty"`

	// Campaigns: Retrieved campaigns in SDF format.
	Campaigns string `json:"campaigns,omitempty"`

	// InsertionOrders: Retrieved insertion orders in SDF format.
	InsertionOrders string `json:"insertionOrders,omitempty"`

	InventorySources string `json:"inventorySources,omitempty"`

	// LineItems: Retrieved line items in SDF format.
	LineItems string `json:"lineItems,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the
	// server.
	googleapi.ServerResponse `json:"-"`

	// ForceSendFields is a list of field names (e.g. "AdGroups") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "AdGroups") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *DownloadResponse) MarshalJSON() ([]byte, error) {
	type NoMethod DownloadResponse
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// EventFilter: Defines the type of filter to be applied to the path, a
// DV360 event dimension
// filter.
type EventFilter struct {
	// DimensionFilter: Filter on a dimension.
	DimensionFilter *PathQueryOptionsFilter `json:"dimensionFilter,omitempty"`

	// ForceSendFields is a list of field names (e.g. "DimensionFilter") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "DimensionFilter") to
	// include in API requests with the JSON null value. By default, fields
	// with empty values are omitted from API requests. However, any field
	// with an empty value appearing in NullFields will be sent to the
	// server as null. It is an error if a field in this list has a
	// non-empty value. This may be used to include null fields in Patch
	// requests.
	NullFields []string `json:"-"`
}

func (s *EventFilter) MarshalJSON() ([]byte, error) {
	type NoMethod EventFilter
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// FilterPair: Filter used to match traffic data in your report.
type FilterPair struct {
	// Type: Filter type.
	//
	// Possible values:
	//   "FILTER_UNKNOWN"
	//   "FILTER_DATE"
	//   "FILTER_DAY_OF_WEEK"
	//   "FILTER_WEEK"
	//   "FILTER_MONTH"
	//   "FILTER_YEAR"
	//   "FILTER_TIME_OF_DAY"
	//   "FILTER_CONVERSION_DELAY"
	//   "FILTER_CREATIVE_ID"
	//   "FILTER_CREATIVE_SIZE"
	//   "FILTER_CREATIVE_TYPE"
	//   "FILTER_EXCHANGE_ID"
	//   "FILTER_AD_POSITION"
	//   "FILTER_PUBLIC_INVENTORY"
	//   "FILTER_INVENTORY_SOURCE"
	//   "FILTER_CITY"
	//   "FILTER_REGION"
	//   "FILTER_DMA"
	//   "FILTER_COUNTRY"
	//   "FILTER_SITE_ID"
	//   "FILTER_CHANNEL_ID"
	//   "FILTER_PARTNER"
	//   "FILTER_ADVERTISER"
	//   "FILTER_INSERTION_ORDER"
	//   "FILTER_LINE_ITEM"
	//   "FILTER_PARTNER_CURRENCY"
	//   "FILTER_ADVERTISER_CURRENCY"
	//   "FILTER_ADVERTISER_TIMEZONE"
	//   "FILTER_LINE_ITEM_TYPE"
	//   "FILTER_USER_LIST"
	//   "FILTER_USER_LIST_FIRST_PARTY"
	//   "FILTER_USER_LIST_THIRD_PARTY"
	//   "FILTER_TARGETED_USER_LIST"
	//   "FILTER_DATA_PROVIDER"
	//   "FILTER_ORDER_ID"
	//   "FILTER_VIDEO_PLAYER_SIZE"
	//   "FILTER_VIDEO_DURATION_SECONDS"
	//   "FILTER_KEYWORD"
	//   "FILTER_PAGE_CATEGORY"
	//   "FILTER_CAMPAIGN_DAILY_FREQUENCY"
	//   "FILTER_LINE_ITEM_DAILY_FREQUENCY"
	//   "FILTER_LINE_ITEM_LIFETIME_FREQUENCY"
	//   "FILTER_OS"
	//   "FILTER_BROWSER"
	//   "FILTER_CARRIER"
	//   "FILTER_SITE_LANGUAGE"
	//   "FILTER_INVENTORY_FORMAT"
	//   "FILTER_ZIP_CODE"
	//   "FILTER_VIDEO_RATING_TIER"
	//   "FILTER_VIDEO_FORMAT_SUPPORT"
	//   "FILTER_VIDEO_SKIPPABLE_SUPPORT"
	//   "FILTER_VIDEO_VPAID_SUPPORT"
	//   "FILTER_VIDEO_CREATIVE_DURATION"
	//   "FILTER_PAGE_LAYOUT"
	//   "FILTER_VIDEO_AD_POSITION_IN_STREAM"
	//   "FILTER_AGE"
	//   "FILTER_GENDER"
	//   "FILTER_QUARTER"
	//   "FILTER_TRUEVIEW_CONVERSION_TYPE"
	//   "FILTER_MOBILE_GEO"
	//   "FILTER_MRAID_SUPPORT"
	//   "FILTER_ACTIVE_VIEW_EXPECTED_VIEWABILITY"
	//   "FILTER_VIDEO_CREATIVE_DURATION_SKIPPABLE"
	//   "FILTER_NIELSEN_COUNTRY_CODE"
	//   "FILTER_NIELSEN_DEVICE_ID"
	//   "FILTER_NIELSEN_GENDER"
	//   "FILTER_NIELSEN_AGE"
	//   "FILTER_INVENTORY_SOURCE_TYPE"
	//   "FILTER_CREATIVE_WIDTH"
	//   "FILTER_CREATIVE_HEIGHT"
	//   "FILTER_DFP_ORDER_ID"
	//   "FILTER_TRUEVIEW_AGE"
	//   "FILTER_TRUEVIEW_GENDER"
	//   "FILTER_TRUEVIEW_PARENTAL_STATUS"
	//   "FILTER_TRUEVIEW_REMARKETING_LIST"
	//   "FILTER_TRUEVIEW_INTEREST"
	//   "FILTER_TRUEVIEW_AD_GROUP_ID"
	//   "FILTER_TRUEVIEW_AD_GROUP_AD_ID"
	//   "FILTER_TRUEVIEW_IAR_LANGUAGE"
	//   "FILTER_TRUEVIEW_IAR_GENDER"
	//   "FILTER_TRUEVIEW_IAR_AGE"
	//   "FILTER_TRUEVIEW_IAR_CATEGORY"
	//   "FILTER_TRUEVIEW_IAR_COUNTRY"
	//   "FILTER_TRUEVIEW_IAR_CITY"
	//   "FILTER_TRUEVIEW_IAR_REGION"
	//   "FILTER_TRUEVIEW_IAR_ZIPCODE"
	//   "FILTER_TRUEVIEW_IAR_REMARKETING_LIST"
	//   "FILTER_TRUEVIEW_IAR_INTEREST"
	//   "FILTER_TRUEVIEW_IAR_PARENTAL_STATUS"
	//   "FILTER_TRUEVIEW_IAR_TIME_OF_DAY"
	//   "FILTER_TRUEVIEW_CUSTOM_AFFINITY"
	//   "FILTER_TRUEVIEW_CATEGORY"
	//   "FILTER_TRUEVIEW_KEYWORD"
	//   "FILTER_TRUEVIEW_PLACEMENT"
	//   "FILTER_TRUEVIEW_URL"
	//   "FILTER_TRUEVIEW_COUNTRY"
	//   "FILTER_TRUEVIEW_REGION"
	//   "FILTER_TRUEVIEW_CITY"
	//   "FILTER_TRUEVIEW_DMA"
	//   "FILTER_TRUEVIEW_ZIPCODE"
	//   "FILTER_NOT_SUPPORTED"
	//   "FILTER_MEDIA_PLAN"
	//   "FILTER_TRUEVIEW_IAR_YOUTUBE_CHANNEL"
	//   "FILTER_TRUEVIEW_IAR_YOUTUBE_VIDEO"
	//   "FILTER_SKIPPABLE_SUPPORT"
	//   "FILTER_COMPANION_CREATIVE_ID"
	//   "FILTER_BUDGET_SEGMENT_DESCRIPTION"
	//   "FILTER_FLOODLIGHT_ACTIVITY_ID"
	//   "FILTER_DEVICE_MODEL"
	//   "FILTER_DEVICE_MAKE"
	//   "FILTER_DEVICE_TYPE"
	//   "FILTER_CREATIVE_ATTRIBUTE"
	//   "FILTER_INVENTORY_COMMITMENT_TYPE"
	//   "FILTER_INVENTORY_RATE_TYPE"
	//   "FILTER_INVENTORY_DELIVERY_METHOD"
	//   "FILTER_INVENTORY_SOURCE_EXTERNAL_ID"
	//   "FILTER_AUTHORIZED_SELLER_STATE"
	//   "FILTER_VIDEO_DURATION_SECONDS_RANGE"
	//   "FILTER_PARTNER_NAME"
	//   "FILTER_PARTNER_STATUS"
	//   "FILTER_ADVERTISER_NAME"
	//   "FILTER_ADVERTISER_INTEGRATION_CODE"
	//   "FILTER_ADVERTISER_INTEGRATION_STATUS"
	//   "FILTER_AD_POSITION_NAME"
	//   "FILTER_CARRIER_NAME"
	//   "FILTER_CHANNEL_NAME"
	//   "FILTER_CITY_NAME"
	//   "FILTER_COMPANION_CREATIVE_NAME"
	//   "FILTER_USER_LIST_FIRST_PARTY_NAME"
	//   "FILTER_USER_LIST_THIRD_PARTY_NAME"
	//   "FILTER_NIELSEN_RESTATEMENT_DATE"
	//   "FILTER_NIELSEN_DATE_RANGE"
	//   "FILTER_INSERTION_ORDER_NAME"
	//   "FILTER_REGION_NAME"
	//   "FILTER_DMA_NAME"
	//   "FILTER_TRUEVIEW_IAR_REGION_NAME"
	//   "FILTER_TRUEVIEW_DMA_NAME"
	//   "FILTER_TRUEVIEW_REGION_NAME"
	//   "FILTER_ACTIVE_VIEW_CUSTOM_METRIC_ID"
	//   "FILTER_ACTIVE_VIEW_CUSTOM_METRIC_NAME"
	//   "FILTER_AD_TYPE"
	//   "FILTER_ALGORITHM"
	//   "FILTER_ALGORITHM_ID"
	//   "FILTER_AMP_PAGE_REQUEST"
	//   "FILTER_ANONYMOUS_INVENTORY_MODELING"
	//   "FILTER_APP_URL"
	//   "FILTER_APP_URL_EXCLUDED"
	//   "FILTER_ATTRIBUTED_USERLIST"
	//   "FILTER_ATTRIBUTED_USERLIST_COST"
	//   "FILTER_ATTRIBUTED_USERLIST_TYPE"
	//   "FILTER_ATTRIBUTION_MODEL"
	//   "FILTER_AUDIENCE_LIST"
	//   "FILTER_AUDIENCE_LIST_COST"
	//   "FILTER_AUDIENCE_LIST_TYPE"
	//   "FILTER_AUDIENCE_NAME"
	//   "FILTER_AUDIENCE_TYPE"
	//   "FILTER_BILLABLE_OUTCOME"
	//   "FILTER_BRAND_LIFT_TYPE"
	//   "FILTER_CHANNEL_TYPE"
	//   "FILTER_CM_PLACEMENT_ID"
	//   "FILTER_CONVERSION_SOURCE"
	//   "FILTER_CONVERSION_SOURCE_ID"
	//   "FILTER_COUNTRY_ID"
	//   "FILTER_CREATIVE"
	//   "FILTER_CREATIVE_ASSET"
	//   "FILTER_CREATIVE_INTEGRATION_CODE"
	//   "FILTER_CREATIVE_RENDERED_IN_AMP"
	//   "FILTER_CREATIVE_SOURCE"
	//   "FILTER_CREATIVE_STATUS"
	//   "FILTER_DATA_PROVIDER_NAME"
	//   "FILTER_DETAILED_DEMOGRAPHICS"
	//   "FILTER_DETAILED_DEMOGRAPHICS_ID"
	//   "FILTER_DEVICE"
	//   "FILTER_GAM_INSERTION_ORDER"
	//   "FILTER_GAM_LINE_ITEM"
	//   "FILTER_GAM_LINE_ITEM_ID"
	//   "FILTER_DIGITAL_CONTENT_LABEL"
	//   "FILTER_DOMAIN"
	//   "FILTER_ELIGIBLE_COOKIES_ON_FIRST_PARTY_AUDIENCE_LIST"
	//   "FILTER_ELIGIBLE_COOKIES_ON_THIRD_PARTY_AUDIENCE_LIST_AND_INTEREST"
	//   "FILTER_EXCHANGE"
	//   "FILTER_EXCHANGE_CODE"
	//   "FILTER_EXTENSION"
	//   "FILTER_EXTENSION_STATUS"
	//   "FILTER_EXTENSION_TYPE"
	//   "FILTER_FIRST_PARTY_AUDIENCE_LIST_COST"
	//   "FILTER_FIRST_PARTY_AUDIENCE_LIST_TYPE"
	//   "FILTER_FLOODLIGHT_ACTIVITY"
	//   "FILTER_FORMAT"
	//   "FILTER_GMAIL_AGE"
	//   "FILTER_GMAIL_CITY"
	//   "FILTER_GMAIL_COUNTRY"
	//   "FILTER_GMAIL_COUNTRY_NAME"
	//   "FILTER_GMAIL_DEVICE_TYPE"
	//   "FILTER_GMAIL_DEVICE_TYPE_NAME"
	//   "FILTER_GMAIL_GENDER"
	//   "FILTER_GMAIL_REGION"
	//   "FILTER_GMAIL_REMARKETING_LIST"
	//   "FILTER_HOUSEHOLD_INCOME"
	//   "FILTER_IMPRESSION_COUNTING_METHOD"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_INSERTION_ORDER"
	//   "FILTER_INSERTION_ORDER_INTEGRATION_CODE"
	//   "FILTER_INSERTION_ORDER_STATUS"
	//   "FILTER_INTEREST"
	//   "FILTER_INVENTORY_SOURCE_GROUP"
	//   "FILTER_INVENTORY_SOURCE_GROUP_ID"
	//   "FILTER_INVENTORY_SOURCE_ID"
	//   "FILTER_INVENTORY_SOURCE_NAME"
	//   "FILTER_LIFE_EVENT"
	//   "FILTER_LIFE_EVENTS"
	//   "FILTER_LINE_ITEM_INTEGRATION_CODE"
	//   "FILTER_LINE_ITEM_NAME"
	//   "FILTER_LINE_ITEM_STATUS"
	//   "FILTER_MATCH_RATIO"
	//   "FILTER_MEASUREMENT_SOURCE"
	//   "FILTER_MEDIA_PLAN_NAME"
	//   "FILTER_PARENTAL_STATUS"
	//   "FILTER_PLACEMENT_ALL_YOUTUBE_CHANNELS"
	//   "FILTER_PLATFORM"
	//   "FILTER_PLAYBACK_METHOD"
	//   "FILTER_POSITION_IN_CONTENT"
	//   "FILTER_PUBLISHER_PROPERTY"
	//   "FILTER_PUBLISHER_PROPERTY_ID"
	//   "FILTER_PUBLISHER_PROPERTY_SECTION"
	//   "FILTER_PUBLISHER_PROPERTY_SECTION_ID"
	//   "FILTER_REFUND_REASON"
	//   "FILTER_REMARKETING_LIST"
	//   "FILTER_REWARDED"
	//   "FILTER_SENSITIVE_CATEGORY"
	//   "FILTER_SERVED_PIXEL_DENSITY"
	//   "FILTER_TARGETED_DATA_PROVIDERS"
	//   "FILTER_THIRD_PARTY_AUDIENCE_LIST_COST"
	//   "FILTER_THIRD_PARTY_AUDIENCE_LIST_TYPE"
	//   "FILTER_TRUEVIEW_AD"
	//   "FILTER_TRUEVIEW_AD_GROUP"
	//   "FILTER_TRUEVIEW_DETAILED_DEMOGRAPHICS"
	//   "FILTER_TRUEVIEW_DETAILED_DEMOGRAPHICS_ID"
	//   "FILTER_TRUEVIEW_HOUSEHOLD_INCOME"
	//   "FILTER_TRUEVIEW_IAR_COUNTRY_NAME"
	//   "FILTER_TRUEVIEW_REMARKETING_LIST_NAME"
	//   "FILTER_VARIANT_ID"
	//   "FILTER_VARIANT_NAME"
	//   "FILTER_VARIANT_VERSION"
	//   "FILTER_VERIFICATION_VIDEO_PLAYER_SIZE"
	//   "FILTER_VERIFICATION_VIDEO_POSITION"
	//   "FILTER_VIDEO_COMPANION_CREATIVE_SIZE"
	//   "FILTER_VIDEO_CONTINUOUS_PLAY"
	//   "FILTER_VIDEO_DURATION"
	//   "FILTER_YOUTUBE_ADAPTED_AUDIENCE_LIST"
	//   "FILTER_YOUTUBE_AD_VIDEO"
	//   "FILTER_YOUTUBE_AD_VIDEO_ID"
	//   "FILTER_YOUTUBE_CHANNEL"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_ADVERTISER"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_PARTNER"
	//   "FILTER_YOUTUBE_VIDEO"
	//   "FILTER_ZIP_POSTAL_CODE"
	//   "FILTER_PLACEMENT_NAME_ALL_YOUTUBE_CHANNELS"
	//   "FILTER_TRUEVIEW_PLACEMENT_ID"
	//   "FILTER_PATH_PATTERN_ID"
	//   "FILTER_PATH_EVENT_INDEX"
	//   "FILTER_EVENT_TYPE"
	//   "FILTER_CHANNEL_GROUPING"
	Type string `json:"type,omitempty"`

	// Value: Filter value.
	Value string `json:"value,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Type") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Type") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *FilterPair) MarshalJSON() ([]byte, error) {
	type NoMethod FilterPair
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ListQueriesResponse: List queries response.
type ListQueriesResponse struct {
	// Kind: Identifies what kind of resource this is. Value: the fixed
	// string
	// <code>"doubleclickbidmanager#listQueriesResponse"</code>.
	Kind string `json:"kind,omitempty"`

	// NextPageToken: Next page's pagination token if one exists.
	NextPageToken string `json:"nextPageToken,omitempty"`

	// Queries: Retrieved queries.
	Queries []*Query `json:"queries,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the
	// server.
	googleapi.ServerResponse `json:"-"`

	// ForceSendFields is a list of field names (e.g. "Kind") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Kind") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ListQueriesResponse) MarshalJSON() ([]byte, error) {
	type NoMethod ListQueriesResponse
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ListReportsResponse: List reports response.
type ListReportsResponse struct {
	// Kind: Identifies what kind of resource this is. Value: the fixed
	// string
	// <code>"doubleclickbidmanager#listReportsResponse"</code>.
	Kind string `json:"kind,omitempty"`

	// NextPageToken: Next page's pagination token if one exists.
	NextPageToken string `json:"nextPageToken,omitempty"`

	// Reports: Retrieved reports.
	Reports []*Report `json:"reports,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the
	// server.
	googleapi.ServerResponse `json:"-"`

	// ForceSendFields is a list of field names (e.g. "Kind") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Kind") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ListReportsResponse) MarshalJSON() ([]byte, error) {
	type NoMethod ListReportsResponse
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// Options: Additional query options.
type Options struct {
	// IncludeOnlyTargetedUserLists: Set to true and filter your report by
	// `FILTER_INSERTION_ORDER` or
	// `FILTER_LINE_ITEM` to include data for audience lists specifically
	// targeted
	// by those items.
	IncludeOnlyTargetedUserLists bool `json:"includeOnlyTargetedUserLists,omitempty"`

	// PathQueryOptions: Options that contain Path Filters and Custom
	// Channel Groupings.
	PathQueryOptions *PathQueryOptions `json:"pathQueryOptions,omitempty"`

	// ForceSendFields is a list of field names (e.g.
	// "IncludeOnlyTargetedUserLists") to unconditionally include in API
	// requests. By default, fields with empty values are omitted from API
	// requests. However, any non-pointer, non-interface field appearing in
	// ForceSendFields will be sent to the server regardless of whether the
	// field is empty or not. This may be used to include empty fields in
	// Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g.
	// "IncludeOnlyTargetedUserLists") to include in API requests with the
	// JSON null value. By default, fields with empty values are omitted
	// from API requests. However, any field with an empty value appearing
	// in NullFields will be sent to the server as null. It is an error if a
	// field in this list has a non-empty value. This may be used to include
	// null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Options) MarshalJSON() ([]byte, error) {
	type NoMethod Options
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// Parameters: Parameters of a query or report.
type Parameters struct {
	// Filters: Filters used to match traffic data in your report.
	Filters []*FilterPair `json:"filters,omitempty"`

	// GroupBys: Data is grouped by the filters listed in this field.
	//
	// Possible values:
	//   "FILTER_UNKNOWN"
	//   "FILTER_DATE"
	//   "FILTER_DAY_OF_WEEK"
	//   "FILTER_WEEK"
	//   "FILTER_MONTH"
	//   "FILTER_YEAR"
	//   "FILTER_TIME_OF_DAY"
	//   "FILTER_CONVERSION_DELAY"
	//   "FILTER_CREATIVE_ID"
	//   "FILTER_CREATIVE_SIZE"
	//   "FILTER_CREATIVE_TYPE"
	//   "FILTER_EXCHANGE_ID"
	//   "FILTER_AD_POSITION"
	//   "FILTER_PUBLIC_INVENTORY"
	//   "FILTER_INVENTORY_SOURCE"
	//   "FILTER_CITY"
	//   "FILTER_REGION"
	//   "FILTER_DMA"
	//   "FILTER_COUNTRY"
	//   "FILTER_SITE_ID"
	//   "FILTER_CHANNEL_ID"
	//   "FILTER_PARTNER"
	//   "FILTER_ADVERTISER"
	//   "FILTER_INSERTION_ORDER"
	//   "FILTER_LINE_ITEM"
	//   "FILTER_PARTNER_CURRENCY"
	//   "FILTER_ADVERTISER_CURRENCY"
	//   "FILTER_ADVERTISER_TIMEZONE"
	//   "FILTER_LINE_ITEM_TYPE"
	//   "FILTER_USER_LIST"
	//   "FILTER_USER_LIST_FIRST_PARTY"
	//   "FILTER_USER_LIST_THIRD_PARTY"
	//   "FILTER_TARGETED_USER_LIST"
	//   "FILTER_DATA_PROVIDER"
	//   "FILTER_ORDER_ID"
	//   "FILTER_VIDEO_PLAYER_SIZE"
	//   "FILTER_VIDEO_DURATION_SECONDS"
	//   "FILTER_KEYWORD"
	//   "FILTER_PAGE_CATEGORY"
	//   "FILTER_CAMPAIGN_DAILY_FREQUENCY"
	//   "FILTER_LINE_ITEM_DAILY_FREQUENCY"
	//   "FILTER_LINE_ITEM_LIFETIME_FREQUENCY"
	//   "FILTER_OS"
	//   "FILTER_BROWSER"
	//   "FILTER_CARRIER"
	//   "FILTER_SITE_LANGUAGE"
	//   "FILTER_INVENTORY_FORMAT"
	//   "FILTER_ZIP_CODE"
	//   "FILTER_VIDEO_RATING_TIER"
	//   "FILTER_VIDEO_FORMAT_SUPPORT"
	//   "FILTER_VIDEO_SKIPPABLE_SUPPORT"
	//   "FILTER_VIDEO_VPAID_SUPPORT"
	//   "FILTER_VIDEO_CREATIVE_DURATION"
	//   "FILTER_PAGE_LAYOUT"
	//   "FILTER_VIDEO_AD_POSITION_IN_STREAM"
	//   "FILTER_AGE"
	//   "FILTER_GENDER"
	//   "FILTER_QUARTER"
	//   "FILTER_TRUEVIEW_CONVERSION_TYPE"
	//   "FILTER_MOBILE_GEO"
	//   "FILTER_MRAID_SUPPORT"
	//   "FILTER_ACTIVE_VIEW_EXPECTED_VIEWABILITY"
	//   "FILTER_VIDEO_CREATIVE_DURATION_SKIPPABLE"
	//   "FILTER_NIELSEN_COUNTRY_CODE"
	//   "FILTER_NIELSEN_DEVICE_ID"
	//   "FILTER_NIELSEN_GENDER"
	//   "FILTER_NIELSEN_AGE"
	//   "FILTER_INVENTORY_SOURCE_TYPE"
	//   "FILTER_CREATIVE_WIDTH"
	//   "FILTER_CREATIVE_HEIGHT"
	//   "FILTER_DFP_ORDER_ID"
	//   "FILTER_TRUEVIEW_AGE"
	//   "FILTER_TRUEVIEW_GENDER"
	//   "FILTER_TRUEVIEW_PARENTAL_STATUS"
	//   "FILTER_TRUEVIEW_REMARKETING_LIST"
	//   "FILTER_TRUEVIEW_INTEREST"
	//   "FILTER_TRUEVIEW_AD_GROUP_ID"
	//   "FILTER_TRUEVIEW_AD_GROUP_AD_ID"
	//   "FILTER_TRUEVIEW_IAR_LANGUAGE"
	//   "FILTER_TRUEVIEW_IAR_GENDER"
	//   "FILTER_TRUEVIEW_IAR_AGE"
	//   "FILTER_TRUEVIEW_IAR_CATEGORY"
	//   "FILTER_TRUEVIEW_IAR_COUNTRY"
	//   "FILTER_TRUEVIEW_IAR_CITY"
	//   "FILTER_TRUEVIEW_IAR_REGION"
	//   "FILTER_TRUEVIEW_IAR_ZIPCODE"
	//   "FILTER_TRUEVIEW_IAR_REMARKETING_LIST"
	//   "FILTER_TRUEVIEW_IAR_INTEREST"
	//   "FILTER_TRUEVIEW_IAR_PARENTAL_STATUS"
	//   "FILTER_TRUEVIEW_IAR_TIME_OF_DAY"
	//   "FILTER_TRUEVIEW_CUSTOM_AFFINITY"
	//   "FILTER_TRUEVIEW_CATEGORY"
	//   "FILTER_TRUEVIEW_KEYWORD"
	//   "FILTER_TRUEVIEW_PLACEMENT"
	//   "FILTER_TRUEVIEW_URL"
	//   "FILTER_TRUEVIEW_COUNTRY"
	//   "FILTER_TRUEVIEW_REGION"
	//   "FILTER_TRUEVIEW_CITY"
	//   "FILTER_TRUEVIEW_DMA"
	//   "FILTER_TRUEVIEW_ZIPCODE"
	//   "FILTER_NOT_SUPPORTED"
	//   "FILTER_MEDIA_PLAN"
	//   "FILTER_TRUEVIEW_IAR_YOUTUBE_CHANNEL"
	//   "FILTER_TRUEVIEW_IAR_YOUTUBE_VIDEO"
	//   "FILTER_SKIPPABLE_SUPPORT"
	//   "FILTER_COMPANION_CREATIVE_ID"
	//   "FILTER_BUDGET_SEGMENT_DESCRIPTION"
	//   "FILTER_FLOODLIGHT_ACTIVITY_ID"
	//   "FILTER_DEVICE_MODEL"
	//   "FILTER_DEVICE_MAKE"
	//   "FILTER_DEVICE_TYPE"
	//   "FILTER_CREATIVE_ATTRIBUTE"
	//   "FILTER_INVENTORY_COMMITMENT_TYPE"
	//   "FILTER_INVENTORY_RATE_TYPE"
	//   "FILTER_INVENTORY_DELIVERY_METHOD"
	//   "FILTER_INVENTORY_SOURCE_EXTERNAL_ID"
	//   "FILTER_AUTHORIZED_SELLER_STATE"
	//   "FILTER_VIDEO_DURATION_SECONDS_RANGE"
	//   "FILTER_PARTNER_NAME"
	//   "FILTER_PARTNER_STATUS"
	//   "FILTER_ADVERTISER_NAME"
	//   "FILTER_ADVERTISER_INTEGRATION_CODE"
	//   "FILTER_ADVERTISER_INTEGRATION_STATUS"
	//   "FILTER_AD_POSITION_NAME"
	//   "FILTER_CARRIER_NAME"
	//   "FILTER_CHANNEL_NAME"
	//   "FILTER_CITY_NAME"
	//   "FILTER_COMPANION_CREATIVE_NAME"
	//   "FILTER_USER_LIST_FIRST_PARTY_NAME"
	//   "FILTER_USER_LIST_THIRD_PARTY_NAME"
	//   "FILTER_NIELSEN_RESTATEMENT_DATE"
	//   "FILTER_NIELSEN_DATE_RANGE"
	//   "FILTER_INSERTION_ORDER_NAME"
	//   "FILTER_REGION_NAME"
	//   "FILTER_DMA_NAME"
	//   "FILTER_TRUEVIEW_IAR_REGION_NAME"
	//   "FILTER_TRUEVIEW_DMA_NAME"
	//   "FILTER_TRUEVIEW_REGION_NAME"
	//   "FILTER_ACTIVE_VIEW_CUSTOM_METRIC_ID"
	//   "FILTER_ACTIVE_VIEW_CUSTOM_METRIC_NAME"
	//   "FILTER_AD_TYPE"
	//   "FILTER_ALGORITHM"
	//   "FILTER_ALGORITHM_ID"
	//   "FILTER_AMP_PAGE_REQUEST"
	//   "FILTER_ANONYMOUS_INVENTORY_MODELING"
	//   "FILTER_APP_URL"
	//   "FILTER_APP_URL_EXCLUDED"
	//   "FILTER_ATTRIBUTED_USERLIST"
	//   "FILTER_ATTRIBUTED_USERLIST_COST"
	//   "FILTER_ATTRIBUTED_USERLIST_TYPE"
	//   "FILTER_ATTRIBUTION_MODEL"
	//   "FILTER_AUDIENCE_LIST"
	//   "FILTER_AUDIENCE_LIST_COST"
	//   "FILTER_AUDIENCE_LIST_TYPE"
	//   "FILTER_AUDIENCE_NAME"
	//   "FILTER_AUDIENCE_TYPE"
	//   "FILTER_BILLABLE_OUTCOME"
	//   "FILTER_BRAND_LIFT_TYPE"
	//   "FILTER_CHANNEL_TYPE"
	//   "FILTER_CM_PLACEMENT_ID"
	//   "FILTER_CONVERSION_SOURCE"
	//   "FILTER_CONVERSION_SOURCE_ID"
	//   "FILTER_COUNTRY_ID"
	//   "FILTER_CREATIVE"
	//   "FILTER_CREATIVE_ASSET"
	//   "FILTER_CREATIVE_INTEGRATION_CODE"
	//   "FILTER_CREATIVE_RENDERED_IN_AMP"
	//   "FILTER_CREATIVE_SOURCE"
	//   "FILTER_CREATIVE_STATUS"
	//   "FILTER_DATA_PROVIDER_NAME"
	//   "FILTER_DETAILED_DEMOGRAPHICS"
	//   "FILTER_DETAILED_DEMOGRAPHICS_ID"
	//   "FILTER_DEVICE"
	//   "FILTER_GAM_INSERTION_ORDER"
	//   "FILTER_GAM_LINE_ITEM"
	//   "FILTER_GAM_LINE_ITEM_ID"
	//   "FILTER_DIGITAL_CONTENT_LABEL"
	//   "FILTER_DOMAIN"
	//   "FILTER_ELIGIBLE_COOKIES_ON_FIRST_PARTY_AUDIENCE_LIST"
	//   "FILTER_ELIGIBLE_COOKIES_ON_THIRD_PARTY_AUDIENCE_LIST_AND_INTEREST"
	//   "FILTER_EXCHANGE"
	//   "FILTER_EXCHANGE_CODE"
	//   "FILTER_EXTENSION"
	//   "FILTER_EXTENSION_STATUS"
	//   "FILTER_EXTENSION_TYPE"
	//   "FILTER_FIRST_PARTY_AUDIENCE_LIST_COST"
	//   "FILTER_FIRST_PARTY_AUDIENCE_LIST_TYPE"
	//   "FILTER_FLOODLIGHT_ACTIVITY"
	//   "FILTER_FORMAT"
	//   "FILTER_GMAIL_AGE"
	//   "FILTER_GMAIL_CITY"
	//   "FILTER_GMAIL_COUNTRY"
	//   "FILTER_GMAIL_COUNTRY_NAME"
	//   "FILTER_GMAIL_DEVICE_TYPE"
	//   "FILTER_GMAIL_DEVICE_TYPE_NAME"
	//   "FILTER_GMAIL_GENDER"
	//   "FILTER_GMAIL_REGION"
	//   "FILTER_GMAIL_REMARKETING_LIST"
	//   "FILTER_HOUSEHOLD_INCOME"
	//   "FILTER_IMPRESSION_COUNTING_METHOD"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_INSERTION_ORDER"
	//   "FILTER_INSERTION_ORDER_INTEGRATION_CODE"
	//   "FILTER_INSERTION_ORDER_STATUS"
	//   "FILTER_INTEREST"
	//   "FILTER_INVENTORY_SOURCE_GROUP"
	//   "FILTER_INVENTORY_SOURCE_GROUP_ID"
	//   "FILTER_INVENTORY_SOURCE_ID"
	//   "FILTER_INVENTORY_SOURCE_NAME"
	//   "FILTER_LIFE_EVENT"
	//   "FILTER_LIFE_EVENTS"
	//   "FILTER_LINE_ITEM_INTEGRATION_CODE"
	//   "FILTER_LINE_ITEM_NAME"
	//   "FILTER_LINE_ITEM_STATUS"
	//   "FILTER_MATCH_RATIO"
	//   "FILTER_MEASUREMENT_SOURCE"
	//   "FILTER_MEDIA_PLAN_NAME"
	//   "FILTER_PARENTAL_STATUS"
	//   "FILTER_PLACEMENT_ALL_YOUTUBE_CHANNELS"
	//   "FILTER_PLATFORM"
	//   "FILTER_PLAYBACK_METHOD"
	//   "FILTER_POSITION_IN_CONTENT"
	//   "FILTER_PUBLISHER_PROPERTY"
	//   "FILTER_PUBLISHER_PROPERTY_ID"
	//   "FILTER_PUBLISHER_PROPERTY_SECTION"
	//   "FILTER_PUBLISHER_PROPERTY_SECTION_ID"
	//   "FILTER_REFUND_REASON"
	//   "FILTER_REMARKETING_LIST"
	//   "FILTER_REWARDED"
	//   "FILTER_SENSITIVE_CATEGORY"
	//   "FILTER_SERVED_PIXEL_DENSITY"
	//   "FILTER_TARGETED_DATA_PROVIDERS"
	//   "FILTER_THIRD_PARTY_AUDIENCE_LIST_COST"
	//   "FILTER_THIRD_PARTY_AUDIENCE_LIST_TYPE"
	//   "FILTER_TRUEVIEW_AD"
	//   "FILTER_TRUEVIEW_AD_GROUP"
	//   "FILTER_TRUEVIEW_DETAILED_DEMOGRAPHICS"
	//   "FILTER_TRUEVIEW_DETAILED_DEMOGRAPHICS_ID"
	//   "FILTER_TRUEVIEW_HOUSEHOLD_INCOME"
	//   "FILTER_TRUEVIEW_IAR_COUNTRY_NAME"
	//   "FILTER_TRUEVIEW_REMARKETING_LIST_NAME"
	//   "FILTER_VARIANT_ID"
	//   "FILTER_VARIANT_NAME"
	//   "FILTER_VARIANT_VERSION"
	//   "FILTER_VERIFICATION_VIDEO_PLAYER_SIZE"
	//   "FILTER_VERIFICATION_VIDEO_POSITION"
	//   "FILTER_VIDEO_COMPANION_CREATIVE_SIZE"
	//   "FILTER_VIDEO_CONTINUOUS_PLAY"
	//   "FILTER_VIDEO_DURATION"
	//   "FILTER_YOUTUBE_ADAPTED_AUDIENCE_LIST"
	//   "FILTER_YOUTUBE_AD_VIDEO"
	//   "FILTER_YOUTUBE_AD_VIDEO_ID"
	//   "FILTER_YOUTUBE_CHANNEL"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_ADVERTISER"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_PARTNER"
	//   "FILTER_YOUTUBE_VIDEO"
	//   "FILTER_ZIP_POSTAL_CODE"
	//   "FILTER_PLACEMENT_NAME_ALL_YOUTUBE_CHANNELS"
	//   "FILTER_TRUEVIEW_PLACEMENT_ID"
	//   "FILTER_PATH_PATTERN_ID"
	//   "FILTER_PATH_EVENT_INDEX"
	//   "FILTER_EVENT_TYPE"
	//   "FILTER_CHANNEL_GROUPING"
	GroupBys []string `json:"groupBys,omitempty"`

	// IncludeInviteData: Deprecated. This field is no longer in use.
	IncludeInviteData bool `json:"includeInviteData,omitempty"`

	// Metrics: Metrics to include as columns in your report.
	//
	// Possible values:
	//   "METRIC_UNKNOWN"
	//   "METRIC_IMPRESSIONS"
	//   "METRIC_CLICKS"
	//   "METRIC_LAST_IMPRESSIONS"
	//   "METRIC_LAST_CLICKS"
	//   "METRIC_TOTAL_CONVERSIONS"
	//   "METRIC_MEDIA_COST_ADVERTISER"
	//   "METRIC_MEDIA_COST_USD"
	//   "METRIC_MEDIA_COST_PARTNER"
	//   "METRIC_DATA_COST_ADVERTISER"
	//   "METRIC_DATA_COST_USD"
	//   "METRIC_DATA_COST_PARTNER"
	//   "METRIC_CPM_FEE1_ADVERTISER"
	//   "METRIC_CPM_FEE1_USD"
	//   "METRIC_CPM_FEE1_PARTNER"
	//   "METRIC_CPM_FEE2_ADVERTISER"
	//   "METRIC_CPM_FEE2_USD"
	//   "METRIC_CPM_FEE2_PARTNER"
	//   "METRIC_MEDIA_FEE1_ADVERTISER"
	//   "METRIC_MEDIA_FEE1_USD"
	//   "METRIC_MEDIA_FEE1_PARTNER"
	//   "METRIC_MEDIA_FEE2_ADVERTISER"
	//   "METRIC_MEDIA_FEE2_USD"
	//   "METRIC_MEDIA_FEE2_PARTNER"
	//   "METRIC_REVENUE_ADVERTISER"
	//   "METRIC_REVENUE_USD"
	//   "METRIC_REVENUE_PARTNER"
	//   "METRIC_PROFIT_ADVERTISER"
	//   "METRIC_PROFIT_USD"
	//   "METRIC_PROFIT_PARTNER"
	//   "METRIC_PROFIT_MARGIN"
	//   "METRIC_TOTAL_MEDIA_COST_USD"
	//   "METRIC_TOTAL_MEDIA_COST_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_ADVERTISER"
	//   "METRIC_BILLABLE_COST_USD"
	//   "METRIC_BILLABLE_COST_PARTNER"
	//   "METRIC_BILLABLE_COST_ADVERTISER"
	//   "METRIC_PLATFORM_FEE_USD"
	//   "METRIC_PLATFORM_FEE_PARTNER"
	//   "METRIC_PLATFORM_FEE_ADVERTISER"
	//   "METRIC_VIDEO_COMPLETION_RATE"
	//   "METRIC_PROFIT_ECPM_ADVERTISER"
	//   "METRIC_PROFIT_ECPM_USD"
	//   "METRIC_PROFIT_ECPM_PARTNER"
	//   "METRIC_REVENUE_ECPM_ADVERTISER"
	//   "METRIC_REVENUE_ECPM_USD"
	//   "METRIC_REVENUE_ECPM_PARTNER"
	//   "METRIC_REVENUE_ECPC_ADVERTISER"
	//   "METRIC_REVENUE_ECPC_USD"
	//   "METRIC_REVENUE_ECPC_PARTNER"
	//   "METRIC_REVENUE_ECPA_ADVERTISER"
	//   "METRIC_REVENUE_ECPA_USD"
	//   "METRIC_REVENUE_ECPA_PARTNER"
	//   "METRIC_REVENUE_ECPAPV_ADVERTISER"
	//   "METRIC_REVENUE_ECPAPV_USD"
	//   "METRIC_REVENUE_ECPAPV_PARTNER"
	//   "METRIC_REVENUE_ECPAPC_ADVERTISER"
	//   "METRIC_REVENUE_ECPAPC_USD"
	//   "METRIC_REVENUE_ECPAPC_PARTNER"
	//   "METRIC_MEDIA_COST_ECPM_ADVERTISER"
	//   "METRIC_MEDIA_COST_ECPM_USD"
	//   "METRIC_MEDIA_COST_ECPM_PARTNER"
	//   "METRIC_MEDIA_COST_ECPC_ADVERTISER"
	//   "METRIC_MEDIA_COST_ECPC_USD"
	//   "METRIC_MEDIA_COST_ECPC_PARTNER"
	//   "METRIC_MEDIA_COST_ECPA_ADVERTISER"
	//   "METRIC_MEDIA_COST_ECPA_USD"
	//   "METRIC_MEDIA_COST_ECPA_PARTNER"
	//   "METRIC_MEDIA_COST_ECPAPV_ADVERTISER"
	//   "METRIC_MEDIA_COST_ECPAPV_USD"
	//   "METRIC_MEDIA_COST_ECPAPV_PARTNER"
	//   "METRIC_MEDIA_COST_ECPAPC_ADVERTISER"
	//   "METRIC_MEDIA_COST_ECPAPC_USD"
	//   "METRIC_MEDIA_COST_ECPAPC_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPM_ADVERTISER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPM_USD"
	//   "METRIC_TOTAL_MEDIA_COST_ECPM_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPC_ADVERTISER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPC_USD"
	//   "METRIC_TOTAL_MEDIA_COST_ECPC_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPA_ADVERTISER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPA_USD"
	//   "METRIC_TOTAL_MEDIA_COST_ECPA_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPAPV_ADVERTISER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPAPV_USD"
	//   "METRIC_TOTAL_MEDIA_COST_ECPAPV_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPAPC_ADVERTISER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPAPC_USD"
	//   "METRIC_TOTAL_MEDIA_COST_ECPAPC_PARTNER"
	//   "METRIC_RICH_MEDIA_VIDEO_PLAYS"
	//   "METRIC_RICH_MEDIA_VIDEO_COMPLETIONS"
	//   "METRIC_RICH_MEDIA_VIDEO_PAUSES"
	//   "METRIC_RICH_MEDIA_VIDEO_MUTES"
	//   "METRIC_RICH_MEDIA_VIDEO_MIDPOINTS"
	//   "METRIC_RICH_MEDIA_VIDEO_FULL_SCREENS"
	//   "METRIC_RICH_MEDIA_VIDEO_FIRST_QUARTILE_COMPLETES"
	//   "METRIC_RICH_MEDIA_VIDEO_THIRD_QUARTILE_COMPLETES"
	//   "METRIC_CLICK_TO_POST_CLICK_CONVERSION_RATE"
	//   "METRIC_IMPRESSIONS_TO_CONVERSION_RATE"
	//   "METRIC_CONVERSIONS_PER_MILLE"
	//   "METRIC_CTR"
	//   "METRIC_BID_REQUESTS"
	//   "METRIC_UNIQUE_VISITORS_COOKIES"
	//   "METRIC_REVENUE_ECPCV_ADVERTISER"
	//   "METRIC_REVENUE_ECPCV_USD"
	//   "METRIC_REVENUE_ECPCV_PARTNER"
	//   "METRIC_MEDIA_COST_ECPCV_ADVERTISER"
	//   "METRIC_MEDIA_COST_ECPCV_USD"
	//   "METRIC_MEDIA_COST_ECPCV_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPCV_ADVERTISER"
	//   "METRIC_TOTAL_MEDIA_COST_ECPCV_USD"
	//   "METRIC_TOTAL_MEDIA_COST_ECPCV_PARTNER"
	//   "METRIC_RICH_MEDIA_VIDEO_SKIPS"
	//   "METRIC_FEE2_ADVERTISER"
	//   "METRIC_FEE2_USD"
	//   "METRIC_FEE2_PARTNER"
	//   "METRIC_FEE3_ADVERTISER"
	//   "METRIC_FEE3_USD"
	//   "METRIC_FEE3_PARTNER"
	//   "METRIC_FEE4_ADVERTISER"
	//   "METRIC_FEE4_USD"
	//   "METRIC_FEE4_PARTNER"
	//   "METRIC_FEE5_ADVERTISER"
	//   "METRIC_FEE5_USD"
	//   "METRIC_FEE5_PARTNER"
	//   "METRIC_FEE6_ADVERTISER"
	//   "METRIC_FEE6_USD"
	//   "METRIC_FEE6_PARTNER"
	//   "METRIC_FEE7_ADVERTISER"
	//   "METRIC_FEE7_USD"
	//   "METRIC_FEE7_PARTNER"
	//   "METRIC_FEE8_ADVERTISER"
	//   "METRIC_FEE8_USD"
	//   "METRIC_FEE8_PARTNER"
	//   "METRIC_FEE9_ADVERTISER"
	//   "METRIC_FEE9_USD"
	//   "METRIC_FEE9_PARTNER"
	//   "METRIC_FEE10_ADVERTISER"
	//   "METRIC_FEE10_USD"
	//   "METRIC_FEE10_PARTNER"
	//   "METRIC_FEE11_ADVERTISER"
	//   "METRIC_FEE11_USD"
	//   "METRIC_FEE11_PARTNER"
	//   "METRIC_FEE12_ADVERTISER"
	//   "METRIC_FEE12_USD"
	//   "METRIC_FEE12_PARTNER"
	//   "METRIC_FEE13_ADVERTISER"
	//   "METRIC_FEE13_USD"
	//   "METRIC_FEE13_PARTNER"
	//   "METRIC_FEE14_ADVERTISER"
	//   "METRIC_FEE14_USD"
	//   "METRIC_FEE14_PARTNER"
	//   "METRIC_FEE15_ADVERTISER"
	//   "METRIC_FEE15_USD"
	//   "METRIC_FEE15_PARTNER"
	//   "METRIC_CPM_FEE3_ADVERTISER"
	//   "METRIC_CPM_FEE3_USD"
	//   "METRIC_CPM_FEE3_PARTNER"
	//   "METRIC_CPM_FEE4_ADVERTISER"
	//   "METRIC_CPM_FEE4_USD"
	//   "METRIC_CPM_FEE4_PARTNER"
	//   "METRIC_CPM_FEE5_ADVERTISER"
	//   "METRIC_CPM_FEE5_USD"
	//   "METRIC_CPM_FEE5_PARTNER"
	//   "METRIC_MEDIA_FEE3_ADVERTISER"
	//   "METRIC_MEDIA_FEE3_USD"
	//   "METRIC_MEDIA_FEE3_PARTNER"
	//   "METRIC_MEDIA_FEE4_ADVERTISER"
	//   "METRIC_MEDIA_FEE4_USD"
	//   "METRIC_MEDIA_FEE4_PARTNER"
	//   "METRIC_MEDIA_FEE5_ADVERTISER"
	//   "METRIC_MEDIA_FEE5_USD"
	//   "METRIC_MEDIA_FEE5_PARTNER"
	//   "METRIC_VIDEO_COMPANION_IMPRESSIONS"
	//   "METRIC_VIDEO_COMPANION_CLICKS"
	//   "METRIC_FEE16_ADVERTISER"
	//   "METRIC_FEE16_USD"
	//   "METRIC_FEE16_PARTNER"
	//   "METRIC_FEE17_ADVERTISER"
	//   "METRIC_FEE17_USD"
	//   "METRIC_FEE17_PARTNER"
	//   "METRIC_FEE18_ADVERTISER"
	//   "METRIC_FEE18_USD"
	//   "METRIC_FEE18_PARTNER"
	//   "METRIC_TRUEVIEW_VIEWS"
	//   "METRIC_TRUEVIEW_UNIQUE_VIEWERS"
	//   "METRIC_TRUEVIEW_EARNED_VIEWS"
	//   "METRIC_TRUEVIEW_EARNED_SUBSCRIBERS"
	//   "METRIC_TRUEVIEW_EARNED_PLAYLIST_ADDITIONS"
	//   "METRIC_TRUEVIEW_EARNED_LIKES"
	//   "METRIC_TRUEVIEW_EARNED_SHARES"
	//   "METRIC_TRUEVIEW_IMPRESSION_SHARE"
	//   "METRIC_TRUEVIEW_LOST_IS_BUDGET"
	//   "METRIC_TRUEVIEW_LOST_IS_RANK"
	//   "METRIC_TRUEVIEW_VIEW_THROUGH_CONVERSION"
	//   "METRIC_TRUEVIEW_CONVERSION_MANY_PER_VIEW"
	//   "METRIC_TRUEVIEW_VIEW_RATE"
	//   "METRIC_TRUEVIEW_CONVERSION_RATE_ONE_PER_VIEW"
	//   "METRIC_TRUEVIEW_CPV_ADVERTISER"
	//   "METRIC_TRUEVIEW_CPV_USD"
	//   "METRIC_TRUEVIEW_CPV_PARTNER"
	//   "METRIC_FEE19_ADVERTISER"
	//   "METRIC_FEE19_USD"
	//   "METRIC_FEE19_PARTNER"
	//   "METRIC_TEA_TRUEVIEW_IMPRESSIONS"
	//   "METRIC_TEA_TRUEVIEW_UNIQUE_COOKIES"
	//   "METRIC_FEE20_ADVERTISER"
	//   "METRIC_FEE20_USD"
	//   "METRIC_FEE20_PARTNER"
	//   "METRIC_FEE21_ADVERTISER"
	//   "METRIC_FEE21_USD"
	//   "METRIC_FEE21_PARTNER"
	//   "METRIC_FEE22_ADVERTISER"
	//   "METRIC_FEE22_USD"
	//   "METRIC_FEE22_PARTNER"
	//   "METRIC_TRUEVIEW_TOTAL_CONVERSION_VALUES_ADVERTISER"
	//   "METRIC_TRUEVIEW_TOTAL_CONVERSION_VALUES_USD"
	//   "METRIC_TRUEVIEW_TOTAL_CONVERSION_VALUES_PARTNER"
	//   "METRIC_TRUEVIEW_CONVERSION_COST_MANY_PER_VIEW_ADVERTISER"
	//   "METRIC_TRUEVIEW_CONVERSION_COST_MANY_PER_VIEW_USD"
	//   "METRIC_TRUEVIEW_CONVERSION_COST_MANY_PER_VIEW_PARTNER"
	//   "METRIC_PROFIT_VIEWABLE_ECPM_ADVERTISER"
	//   "METRIC_PROFIT_VIEWABLE_ECPM_USD"
	//   "METRIC_PROFIT_VIEWABLE_ECPM_PARTNER"
	//   "METRIC_REVENUE_VIEWABLE_ECPM_ADVERTISER"
	//   "METRIC_REVENUE_VIEWABLE_ECPM_USD"
	//   "METRIC_REVENUE_VIEWABLE_ECPM_PARTNER"
	//   "METRIC_MEDIA_COST_VIEWABLE_ECPM_ADVERTISER"
	//   "METRIC_MEDIA_COST_VIEWABLE_ECPM_USD"
	//   "METRIC_MEDIA_COST_VIEWABLE_ECPM_PARTNER"
	//   "METRIC_TOTAL_MEDIA_COST_VIEWABLE_ECPM_ADVERTISER"
	//   "METRIC_TOTAL_MEDIA_COST_VIEWABLE_ECPM_USD"
	//   "METRIC_TOTAL_MEDIA_COST_VIEWABLE_ECPM_PARTNER"
	//   "METRIC_TRUEVIEW_ENGAGEMENTS"
	//   "METRIC_TRUEVIEW_ENGAGEMENT_RATE"
	//   "METRIC_TRUEVIEW_AVERAGE_CPE_ADVERTISER"
	//   "METRIC_TRUEVIEW_AVERAGE_CPE_USD"
	//   "METRIC_TRUEVIEW_AVERAGE_CPE_PARTNER"
	//   "METRIC_ACTIVE_VIEW_VIEWABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_ELIGIBLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_MEASURABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_PCT_MEASURABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_PCT_VIEWABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_AVERAGE_VIEWABLE_TIME"
	//   "METRIC_ACTIVE_VIEW_UNMEASURABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_UNVIEWABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_DISTRIBUTION_UNMEASURABLE"
	//   "METRIC_ACTIVE_VIEW_DISTRIBUTION_UNVIEWABLE"
	//   "METRIC_ACTIVE_VIEW_DISTRIBUTION_VIEWABLE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_VIEWABLE_FOR_TIME_THRESHOLD"
	//   "METRIC_ACTIVE_VIEW_VIEWABLE_FOR_TIME_THRESHOLD"
	//   "METRIC_ACTIVE_VIEW_PERCENT_VISIBLE_AT_START"
	//   "METRIC_ACTIVE_VIEW_PERCENT_VISIBLE_FIRST_QUAR"
	//   "METRIC_ACTIVE_VIEW_PERCENT_VISIBLE_SECOND_QUAR"
	//   "METRIC_ACTIVE_VIEW_PERCENT_VISIBLE_THIRD_QUAR"
	//   "METRIC_ACTIVE_VIEW_PERCENT_VISIBLE_ON_COMPLETE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_AUDIBLE_VISIBLE_AT_START"
	//   "METRIC_ACTIVE_VIEW_PERCENT_AUDIBLE_VISIBLE_FIRST_QUAR"
	//   "METRIC_ACTIVE_VIEW_PERCENT_AUDIBLE_VISIBLE_SECOND_QUAR"
	//   "METRIC_ACTIVE_VIEW_PERCENT_AUDIBLE_VISIBLE_THIRD_QUAR"
	//   "METRIC_ACTIVE_VIEW_PERCENT_AUDIBLE_VISIBLE_ON_COMPLETE"
	//   "METRIC_ACTIVE_VIEW_AUDIBLE_VISIBLE_ON_COMPLETE_IMPRESSIONS"
	//   "METRIC_VIEWABLE_BID_REQUESTS"
	//   "METRIC_COOKIE_REACH_IMPRESSION_REACH"
	//   "METRIC_COOKIE_REACH_AVERAGE_IMPRESSION_FREQUENCY"
	//   "METRIC_DBM_ENGAGEMENT_RATE"
	//   "METRIC_RICH_MEDIA_SCROLLS"
	//   "METRIC_CM_POST_VIEW_REVENUE"
	//   "METRIC_CM_POST_CLICK_REVENUE"
	//   "METRIC_FLOODLIGHT_IMPRESSIONS"
	//   "METRIC_BILLABLE_IMPRESSIONS"
	//   "METRIC_NIELSEN_AVERAGE_FREQUENCY"
	//   "METRIC_NIELSEN_IMPRESSIONS"
	//   "METRIC_NIELSEN_UNIQUE_AUDIENCE"
	//   "METRIC_NIELSEN_GRP"
	//   "METRIC_NIELSEN_IMPRESSION_INDEX"
	//   "METRIC_NIELSEN_IMPRESSIONS_SHARE"
	//   "METRIC_NIELSEN_POPULATION"
	//   "METRIC_NIELSEN_POPULATION_REACH"
	//   "METRIC_NIELSEN_POPULATION_SHARE"
	//   "METRIC_NIELSEN_REACH_INDEX"
	//   "METRIC_NIELSEN_REACH_SHARE"
	//
	// "METRIC_ACTIVE_VIEW_AUDIBLE_FULLY_ON_SCREEN_HALF_OF_DURATION_IMPRESSIO
	// NS"
	//
	// "METRIC_ACTIVE_VIEW_AUDIBLE_FULLY_ON_SCREEN_HALF_OF_DURATION_MEASURABL
	// E_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_AUDIBLE_FULLY_ON_SCREEN_HALF_OF_DURATION_RATE"
	//
	// "METRIC_ACTIVE_VIEW_AUDIBLE_FULLY_ON_SCREEN_HALF_OF_DURATION_TRUEVIEW_
	// IMPRESSIONS"
	//
	// "METRIC_ACTIVE_VIEW_AUDIBLE_FULLY_ON_SCREEN_HALF_OF_DURATION_TRUEVIEW_
	// MEASURABLE_IMPRESSIONS"
	//
	// "METRIC_ACTIVE_VIEW_AUDIBLE_FULLY_ON_SCREEN_HALF_OF_DURATION_TRUEVIEW_
	// RATE"
	//   "METRIC_ACTIVE_VIEW_CUSTOM_METRIC_MEASURABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_CUSTOM_METRIC_VIEWABLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_CUSTOM_METRIC_VIEWABLE_RATE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_AUDIBLE_IMPRESSIONS"
	//   "METRIC_ACTIVE_VIEW_PERCENT_FULLY_ON_SCREEN_2_SEC"
	//   "METRIC_ACTIVE_VIEW_PERCENT_FULL_SCREEN"
	//   "METRIC_ACTIVE_VIEW_PERCENT_IN_BACKGROUND"
	//   "METRIC_ACTIVE_VIEW_PERCENT_OF_AD_PLAYED"
	//
	// "METRIC_ACTIVE_VIEW_PERCENT_OF_COMPLETED_IMPRESSIONS_AUDIBLE_AND_VISIB
	// LE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_OF_COMPLETED_IMPRESSIONS_VISIBLE"
	//
	// "METRIC_ACTIVE_VIEW_PERCENT_OF_FIRST_QUARTILE_IMPRESSIONS_AUDIBLE_AND_
	// VISIBLE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_OF_FIRST_QUARTILE_IMPRESSIONS_VISIBLE"
	//
	// "METRIC_ACTIVE_VIEW_PERCENT_OF_MIDPOINT_IMPRESSIONS_AUDIBLE_AND_VISIBL
	// E"
	//   "METRIC_ACTIVE_VIEW_PERCENT_OF_MIDPOINT_IMPRESSIONS_VISIBLE"
	//
	// "METRIC_ACTIVE_VIEW_PERCENT_OF_THIRD_QUARTILE_IMPRESSIONS_AUDIBLE_AND_
	// VISIBLE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_OF_THIRD_QUARTILE_IMPRESSIONS_VISIBLE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_PLAY_TIME_AUDIBLE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_PLAY_TIME_AUDIBLE_AND_VISIBLE"
	//   "METRIC_ACTIVE_VIEW_PERCENT_PLAY_TIME_VISIBLE"
	//   "METRIC_ADAPTED_AUDIENCE_FREQUENCY"
	//   "METRIC_ADLINGO_FEE_ADVERTISER_CURRENCY"
	//   "METRIC_AUDIO_CLIENT_COST_ECPCL_ADVERTISER_CURRENCY"
	//   "METRIC_AUDIO_MEDIA_COST_ECPCL_ADVERTISER_CURRENCY"
	//   "METRIC_AUDIO_MUTES_AUDIO"
	//   "METRIC_AUDIO_REVENUE_ECPCL_ADVERTISER_CURRENCY"
	//   "METRIC_AUDIO_UNMUTES_AUDIO"
	//   "METRIC_AUDIO_UNMUTES_VIDEO"
	//   "METRIC_AVERAGE_DISPLAY_TIME"
	//   "METRIC_AVERAGE_IMPRESSION_FREQUENCY_PER_COOKIE"
	//   "METRIC_AVERAGE_IMPRESSION_FREQUENCY_PER_USER"
	//   "METRIC_AVERAGE_INTERACTION_TIME"
	//   "METRIC_AVERAGE_VIEW_FREQUENCY_PER_COOKIE"
	//   "METRIC_AVERAGE_WATCH_TIME_PER_IMPRESSION"
	//   "METRIC_BEGIN_TO_RENDER_ELIGIBLE_IMPRESSIONS"
	//   "METRIC_BEGIN_TO_RENDER_IMPRESSIONS"
	//   "METRIC_BENCHMARK_FREQUENCY"
	//   "METRIC_BRAND_LIFT_ABSOLUTE_BRAND_LIFT"
	//   "METRIC_BRAND_LIFT_ALL_SURVEY_RESPONSES"
	//   "METRIC_BRAND_LIFT_BASELINE_POSITIVE_RESPONSE_RATE"
	//   "METRIC_BRAND_LIFT_BASELINE_SURVEY_RESPONSES"
	//   "METRIC_BRAND_LIFT_COST_PER_LIFTED_USER"
	//   "METRIC_BRAND_LIFT_EXPOSED_SURVEY_RESPONSES"
	//   "METRIC_BRAND_LIFT_HEADROOM_BRAND_LIFT"
	//   "METRIC_BRAND_LIFT_RELATIVE_BRAND_LIFT"
	//   "METRIC_BRAND_LIFT_USERS"
	//   "METRIC_CARD_CLICKS"
	//   "METRIC_CLIENT_COST_ADVERTISER_CURRENCY"
	//   "METRIC_CLIENT_COST_ECPA_ADVERTISER_CURRENCY"
	//   "METRIC_CLIENT_COST_ECPA_PC_ADVERTISER_CURRENCY"
	//   "METRIC_CLIENT_COST_ECPA_PV_ADVERTISER_CURRENCY"
	//   "METRIC_CLIENT_COST_ECPC_ADVERTISER_CURRENCY"
	//   "METRIC_CLIENT_COST_ECPM_ADVERTISER_CURRENCY"
	//   "METRIC_CLIENT_COST_VIEWABLE_ECPM_ADVERTISER_CURRENCY"
	//   "METRIC_CM_POST_CLICK_REVENUE_CROSS_ENVIRONMENT"
	//   "METRIC_CM_POST_VIEW_REVENUE_CROSS_ENVIRONMENT"
	//   "METRIC_COMPANION_CLICKS_AUDIO"
	//   "METRIC_COMPANION_IMPRESSIONS_AUDIO"
	//   "METRIC_COMPLETE_LISTENS_AUDIO"
	//   "METRIC_COMPLETION_RATE_AUDIO"
	//   "METRIC_COST_PER_STORE_VISIT"
	//   "METRIC_COUNTERS"
	//   "METRIC_CUSTOM_FEE_1_ADVERTISER_CURRENCY"
	//   "METRIC_CUSTOM_FEE_2_ADVERTISER_CURRENCY"
	//   "METRIC_CUSTOM_FEE_3_ADVERTISER_CURRENCY"
	//   "METRIC_CUSTOM_FEE_4_ADVERTISER_CURRENCY"
	//   "METRIC_CUSTOM_FEE_5_ADVERTISER_CURRENCY"
	//   "METRIC_CUSTOM_VALUE_PER_1000_IMPRESSIONS"
	//   "METRIC_ENGAGEMENTS"
	//
	// "METRIC_ESTIMATED_CPM_FOR_IMPRESSIONS_WITH_CUSTOM_VALUE_ADVERTISER_CUR
	// RENCY"
	//
	// "METRIC_ESTIMATED_TOTAL_COST_FOR_IMPRESSIONS_WITH_CUSTOM_VALUE_ADVERTI
	// SER_CURRENCY"
	//   "METRIC_EXITS"
	//   "METRIC_EXPANSIONS"
	//   "METRIC_FIRST_QUARTILE_AUDIO"
	//   "METRIC_GENERAL_INVALID_TRAFFIC_GIVT_IMPRESSIONS"
	//   "METRIC_GENERAL_INVALID_TRAFFIC_GIVT_TRACKED_ADS"
	//   "METRIC_GIVT_ACTIVE_VIEW_ELIGIBLE_IMPRESSIONS"
	//   "METRIC_GIVT_ACTIVE_VIEW_MEASURABLE_IMPRESSIONS"
	//   "METRIC_GIVT_ACTIVE_VIEW_VIEWABLE_IMPRESSIONS"
	//   "METRIC_GIVT_BEGIN_TO_RENDER_IMPRESSIONS"
	//   "METRIC_GIVT_CLICKS"
	//   "METRIC_GMAIL_CONVERSIONS"
	//   "METRIC_GMAIL_POST_CLICK_CONVERSIONS"
	//   "METRIC_GMAIL_POST_VIEW_CONVERSIONS"
	//   "METRIC_GMAIL_POTENTIAL_VIEWS"
	//   "METRIC_IMPRESSIONS_WITH_CUSTOM_VALUE"
	//   "METRIC_IMPRESSIONS_WITH_POSITIVE_CUSTOM_VALUE"
	//   "METRIC_IMPRESSION_CUSTOM_VALUE_COST"
	//   "METRIC_INTERACTIVE_IMPRESSIONS"
	//   "METRIC_INVALID_ACTIVE_VIEW_ELIGIBLE_IMPRESSIONS"
	//   "METRIC_INVALID_ACTIVE_VIEW_MEASURABLE_IMPRESSIONS"
	//   "METRIC_INVALID_ACTIVE_VIEW_VIEWABLE_IMPRESSIONS"
	//   "METRIC_INVALID_BEGIN_TO_RENDER_IMPRESSIONS"
	//   "METRIC_INVALID_CLICKS"
	//   "METRIC_INVALID_IMPRESSIONS"
	//   "METRIC_INVALID_TRACKED_ADS"
	//   "METRIC_MEDIA_COST_ADVERTISER_CURRENCY_PER_STORE_VISIT_ADX_ONLY"
	//   "METRIC_MIDPOINT_AUDIO"
	//   "METRIC_ORIGINAL_AUDIENCE_FREQUENCY"
	//   "METRIC_PAUSES_AUDIO"
	//   "METRIC_PERCENT_IMPRESSIONS_WITH_POSITIVE_CUSTOM_VALUE"
	//   "METRIC_PLATFORM_FEE_RATE"
	//   "METRIC_POST_CLICK_CONVERSIONS_CROSS_ENVIRONMENT"
	//   "METRIC_POST_VIEW_CONVERSIONS_CROSS_ENVIRONMENT"
	//   "METRIC_POTENTIAL_IMPRESSIONS"
	//   "METRIC_POTENTIAL_VIEWS"
	//   "METRIC_PREMIUM_FEE_ADVERTISER_CURRENCY"
	//
	// "METRIC_PROGRAMMATIC_GUARANTEED_IMPRESSIONS_PASSED_DUE_TO_FREQUENCY"
	//
	// "METRIC_PROGRAMMATIC_GUARANTEED_SAVINGS_RE_INVESTED_DUE_TO_FREQUENCY_A
	// DVERTISER_CURRENCY"
	//   "METRIC_REFUND_BILLABLE_COST_ADVERTISER_CURRENCY"
	//   "METRIC_REFUND_MEDIA_COST_ADVERTISER_CURRENCY"
	//   "METRIC_REFUND_PLATFORM_FEE_ADVERTISER_CURRENCY"
	//   "METRIC_REVENUE_ADVERTISER_CURRENCY_PER_STORE_VISIT_ADX_ONLY"
	//   "METRIC_RICH_MEDIA_ENGAGEMENTS"
	//   "METRIC_STARTS_AUDIO"
	//   "METRIC_STOPS_AUDIO"
	//   "METRIC_STORE_VISITS_ADX_ONLY"
	//   "METRIC_STORE_VISIT_CONVERSIONS"
	//   "METRIC_THIRD_QUARTILE_AUDIO"
	//   "METRIC_TIMERS"
	//   "METRIC_TOTAL_AUDIO_MEDIA_COST_ECPCL_ADVERTISER_CURRENCY"
	//   "METRIC_TOTAL_CONVERSIONS_CROSS_ENVIRONMENT"
	//   "METRIC_TOTAL_COOKIES"
	//   "METRIC_TOTAL_DISPLAY_TIME"
	//   "METRIC_TOTAL_IMPRESSION_CUSTOM_VALUE"
	//   "METRIC_TOTAL_INTERACTION_TIME"
	//
	// "METRIC_TOTAL_MEDIA_COST_ADVERTISER_CURRENCY_PER_STORE_VISIT_ADX_ONLY"
	//   "METRIC_TOTAL_USERS"
	//   "METRIC_TOTAL_VIEWERS_COOKIES"
	//   "METRIC_TRACKED_ADS"
	//   "METRIC_TRUEVIEW_GENERAL_INVALID_TRAFFIC_GIVT_VIEWS"
	//   "METRIC_TRUEVIEW_INVALID_VIEWS"
	//   "METRIC_UNIQUE_COOKIES_WITH_IMPRESSIONS"
	//   "METRIC_UNIQUE_REACH_AVERAGE_IMPRESSION_FREQUENCY"
	//   "METRIC_UNIQUE_REACH_CLICK_REACH"
	//   "METRIC_UNIQUE_REACH_IMPRESSION_REACH"
	//   "METRIC_UNIQUE_REACH_TOTAL_REACH"
	//   "METRIC_VERIFIABLE_IMPRESSIONS"
	//   "METRIC_VIDEO_CLIENT_COST_ECPCV_ADVERTISER_CURRENCY"
	//   "METRIC_WATCH_TIME"
	//   "METRIC_LAST_TOUCH_TOTAL_CONVERSIONS"
	//   "METRIC_LAST_TOUCH_CLICK_THROUGH_CONVERSIONS"
	//   "METRIC_LAST_TOUCH_VIEW_THROUGH_CONVERSIONS"
	//   "METRIC_TOTAL_PATHS"
	//   "METRIC_TOTAL_EXPOSURES"
	//   "METRIC_EXPOSURE_CONVERSION_RATE"
	//   "METRIC_PATH_CONVERSION_RATE"
	//   "METRIC_CONVERTING_PATHS"
	//   "METRIC_ACTIVITY_REVENUE"
	//   "METRIC_PERCENT_INVALID_IMPRESSIONS_PREBID"
	//   "METRIC_PROVISIONAL_IMPRESSIONS"
	Metrics []string `json:"metrics,omitempty"`

	// Options: Additional query options.
	Options *Options `json:"options,omitempty"`

	// Type: Report type.
	//
	// Possible values:
	//   "TYPE_GENERAL"
	//   "TYPE_AUDIENCE_PERFORMANCE"
	//   "TYPE_INVENTORY_AVAILABILITY"
	//   "TYPE_KEYWORD"
	//   "TYPE_PIXEL_LOAD"
	//   "TYPE_AUDIENCE_COMPOSITION"
	//   "TYPE_CROSS_PARTNER"
	//   "TYPE_PAGE_CATEGORY"
	//   "TYPE_THIRD_PARTY_DATA_PROVIDER"
	//   "TYPE_CROSS_PARTNER_THIRD_PARTY_DATA_PROVIDER"
	//   "TYPE_CLIENT_SAFE"
	//   "TYPE_ORDER_ID"
	//   "TYPE_FEE"
	//   "TYPE_CROSS_FEE"
	//   "TYPE_ACTIVE_GRP"
	//   "TYPE_YOUTUBE_VERTICAL"
	//   "TYPE_COMSCORE_VCE"
	//   "TYPE_TRUEVIEW"
	//   "TYPE_NIELSEN_AUDIENCE_PROFILE"
	//   "TYPE_NIELSEN_DAILY_REACH_BUILD"
	//   "TYPE_NIELSEN_SITE"
	//   "TYPE_REACH_AND_FREQUENCY"
	//   "TYPE_ESTIMATED_CONVERSION"
	//   "TYPE_VERIFICATION"
	//   "TYPE_TRUEVIEW_IAR"
	//   "TYPE_NIELSEN_ONLINE_GLOBAL_MARKET"
	//   "TYPE_PETRA_NIELSEN_AUDIENCE_PROFILE"
	//   "TYPE_PETRA_NIELSEN_DAILY_REACH_BUILD"
	//   "TYPE_PETRA_NIELSEN_ONLINE_GLOBAL_MARKET"
	//   "TYPE_NOT_SUPPORTED"
	//   "TYPE_REACH_AUDIENCE"
	//   "TYPE_LINEAR_TV_SEARCH_LIFT"
	//   "TYPE_PATH"
	//   "TYPE_PATH_ATTRIBUTION"
	Type string `json:"type,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Filters") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Filters") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Parameters) MarshalJSON() ([]byte, error) {
	type NoMethod Parameters
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// PathFilter: Path filters specify which paths to include in a report.
// A path is the result
// of combining DV360 events based on User ID to create a workflow
// of
// users' actions.<br><br> When a path filter is set, the resulting
// report will only include paths that match the specified event at the
// specified position. All other paths will be excluded.
type PathFilter struct {
	// EventFilters: Filter on an event to be applied to some part of the
	// path.
	EventFilters []*EventFilter `json:"eventFilters,omitempty"`

	// PathMatchPosition: Indicates the position of the path the filter
	// should match to (first, last,
	// or any event in path).
	//
	// Possible values:
	//   "ANY"
	//   "FIRST"
	//   "LAST"
	PathMatchPosition string `json:"pathMatchPosition,omitempty"`

	// ForceSendFields is a list of field names (e.g. "EventFilters") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "EventFilters") to include
	// in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. However, any field with
	// an empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *PathFilter) MarshalJSON() ([]byte, error) {
	type NoMethod PathFilter
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// PathQueryOptions: Path Query Options for Report Options.
type PathQueryOptions struct {
	// ChannelGrouping: Custom Channel Groupings.
	ChannelGrouping *ChannelGrouping `json:"channelGrouping,omitempty"`

	// PathFilters: Path Filters. There is a limit of 100 path filters that
	// can be set per
	// report.
	PathFilters []*PathFilter `json:"pathFilters,omitempty"`

	// ForceSendFields is a list of field names (e.g. "ChannelGrouping") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "ChannelGrouping") to
	// include in API requests with the JSON null value. By default, fields
	// with empty values are omitted from API requests. However, any field
	// with an empty value appearing in NullFields will be sent to the
	// server as null. It is an error if a field in this list has a
	// non-empty value. This may be used to include null fields in Patch
	// requests.
	NullFields []string `json:"-"`
}

func (s *PathQueryOptions) MarshalJSON() ([]byte, error) {
	type NoMethod PathQueryOptions
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// PathQueryOptionsFilter: Dimension Filter for a Path Filter.
type PathQueryOptionsFilter struct {
	// Filter: Dimension the filter is applied to.
	//
	// Possible values:
	//   "FILTER_UNKNOWN"
	//   "FILTER_DATE"
	//   "FILTER_DAY_OF_WEEK"
	//   "FILTER_WEEK"
	//   "FILTER_MONTH"
	//   "FILTER_YEAR"
	//   "FILTER_TIME_OF_DAY"
	//   "FILTER_CONVERSION_DELAY"
	//   "FILTER_CREATIVE_ID"
	//   "FILTER_CREATIVE_SIZE"
	//   "FILTER_CREATIVE_TYPE"
	//   "FILTER_EXCHANGE_ID"
	//   "FILTER_AD_POSITION"
	//   "FILTER_PUBLIC_INVENTORY"
	//   "FILTER_INVENTORY_SOURCE"
	//   "FILTER_CITY"
	//   "FILTER_REGION"
	//   "FILTER_DMA"
	//   "FILTER_COUNTRY"
	//   "FILTER_SITE_ID"
	//   "FILTER_CHANNEL_ID"
	//   "FILTER_PARTNER"
	//   "FILTER_ADVERTISER"
	//   "FILTER_INSERTION_ORDER"
	//   "FILTER_LINE_ITEM"
	//   "FILTER_PARTNER_CURRENCY"
	//   "FILTER_ADVERTISER_CURRENCY"
	//   "FILTER_ADVERTISER_TIMEZONE"
	//   "FILTER_LINE_ITEM_TYPE"
	//   "FILTER_USER_LIST"
	//   "FILTER_USER_LIST_FIRST_PARTY"
	//   "FILTER_USER_LIST_THIRD_PARTY"
	//   "FILTER_TARGETED_USER_LIST"
	//   "FILTER_DATA_PROVIDER"
	//   "FILTER_ORDER_ID"
	//   "FILTER_VIDEO_PLAYER_SIZE"
	//   "FILTER_VIDEO_DURATION_SECONDS"
	//   "FILTER_KEYWORD"
	//   "FILTER_PAGE_CATEGORY"
	//   "FILTER_CAMPAIGN_DAILY_FREQUENCY"
	//   "FILTER_LINE_ITEM_DAILY_FREQUENCY"
	//   "FILTER_LINE_ITEM_LIFETIME_FREQUENCY"
	//   "FILTER_OS"
	//   "FILTER_BROWSER"
	//   "FILTER_CARRIER"
	//   "FILTER_SITE_LANGUAGE"
	//   "FILTER_INVENTORY_FORMAT"
	//   "FILTER_ZIP_CODE"
	//   "FILTER_VIDEO_RATING_TIER"
	//   "FILTER_VIDEO_FORMAT_SUPPORT"
	//   "FILTER_VIDEO_SKIPPABLE_SUPPORT"
	//   "FILTER_VIDEO_VPAID_SUPPORT"
	//   "FILTER_VIDEO_CREATIVE_DURATION"
	//   "FILTER_PAGE_LAYOUT"
	//   "FILTER_VIDEO_AD_POSITION_IN_STREAM"
	//   "FILTER_AGE"
	//   "FILTER_GENDER"
	//   "FILTER_QUARTER"
	//   "FILTER_TRUEVIEW_CONVERSION_TYPE"
	//   "FILTER_MOBILE_GEO"
	//   "FILTER_MRAID_SUPPORT"
	//   "FILTER_ACTIVE_VIEW_EXPECTED_VIEWABILITY"
	//   "FILTER_VIDEO_CREATIVE_DURATION_SKIPPABLE"
	//   "FILTER_NIELSEN_COUNTRY_CODE"
	//   "FILTER_NIELSEN_DEVICE_ID"
	//   "FILTER_NIELSEN_GENDER"
	//   "FILTER_NIELSEN_AGE"
	//   "FILTER_INVENTORY_SOURCE_TYPE"
	//   "FILTER_CREATIVE_WIDTH"
	//   "FILTER_CREATIVE_HEIGHT"
	//   "FILTER_DFP_ORDER_ID"
	//   "FILTER_TRUEVIEW_AGE"
	//   "FILTER_TRUEVIEW_GENDER"
	//   "FILTER_TRUEVIEW_PARENTAL_STATUS"
	//   "FILTER_TRUEVIEW_REMARKETING_LIST"
	//   "FILTER_TRUEVIEW_INTEREST"
	//   "FILTER_TRUEVIEW_AD_GROUP_ID"
	//   "FILTER_TRUEVIEW_AD_GROUP_AD_ID"
	//   "FILTER_TRUEVIEW_IAR_LANGUAGE"
	//   "FILTER_TRUEVIEW_IAR_GENDER"
	//   "FILTER_TRUEVIEW_IAR_AGE"
	//   "FILTER_TRUEVIEW_IAR_CATEGORY"
	//   "FILTER_TRUEVIEW_IAR_COUNTRY"
	//   "FILTER_TRUEVIEW_IAR_CITY"
	//   "FILTER_TRUEVIEW_IAR_REGION"
	//   "FILTER_TRUEVIEW_IAR_ZIPCODE"
	//   "FILTER_TRUEVIEW_IAR_REMARKETING_LIST"
	//   "FILTER_TRUEVIEW_IAR_INTEREST"
	//   "FILTER_TRUEVIEW_IAR_PARENTAL_STATUS"
	//   "FILTER_TRUEVIEW_IAR_TIME_OF_DAY"
	//   "FILTER_TRUEVIEW_CUSTOM_AFFINITY"
	//   "FILTER_TRUEVIEW_CATEGORY"
	//   "FILTER_TRUEVIEW_KEYWORD"
	//   "FILTER_TRUEVIEW_PLACEMENT"
	//   "FILTER_TRUEVIEW_URL"
	//   "FILTER_TRUEVIEW_COUNTRY"
	//   "FILTER_TRUEVIEW_REGION"
	//   "FILTER_TRUEVIEW_CITY"
	//   "FILTER_TRUEVIEW_DMA"
	//   "FILTER_TRUEVIEW_ZIPCODE"
	//   "FILTER_NOT_SUPPORTED"
	//   "FILTER_MEDIA_PLAN"
	//   "FILTER_TRUEVIEW_IAR_YOUTUBE_CHANNEL"
	//   "FILTER_TRUEVIEW_IAR_YOUTUBE_VIDEO"
	//   "FILTER_SKIPPABLE_SUPPORT"
	//   "FILTER_COMPANION_CREATIVE_ID"
	//   "FILTER_BUDGET_SEGMENT_DESCRIPTION"
	//   "FILTER_FLOODLIGHT_ACTIVITY_ID"
	//   "FILTER_DEVICE_MODEL"
	//   "FILTER_DEVICE_MAKE"
	//   "FILTER_DEVICE_TYPE"
	//   "FILTER_CREATIVE_ATTRIBUTE"
	//   "FILTER_INVENTORY_COMMITMENT_TYPE"
	//   "FILTER_INVENTORY_RATE_TYPE"
	//   "FILTER_INVENTORY_DELIVERY_METHOD"
	//   "FILTER_INVENTORY_SOURCE_EXTERNAL_ID"
	//   "FILTER_AUTHORIZED_SELLER_STATE"
	//   "FILTER_VIDEO_DURATION_SECONDS_RANGE"
	//   "FILTER_PARTNER_NAME"
	//   "FILTER_PARTNER_STATUS"
	//   "FILTER_ADVERTISER_NAME"
	//   "FILTER_ADVERTISER_INTEGRATION_CODE"
	//   "FILTER_ADVERTISER_INTEGRATION_STATUS"
	//   "FILTER_AD_POSITION_NAME"
	//   "FILTER_CARRIER_NAME"
	//   "FILTER_CHANNEL_NAME"
	//   "FILTER_CITY_NAME"
	//   "FILTER_COMPANION_CREATIVE_NAME"
	//   "FILTER_USER_LIST_FIRST_PARTY_NAME"
	//   "FILTER_USER_LIST_THIRD_PARTY_NAME"
	//   "FILTER_NIELSEN_RESTATEMENT_DATE"
	//   "FILTER_NIELSEN_DATE_RANGE"
	//   "FILTER_INSERTION_ORDER_NAME"
	//   "FILTER_REGION_NAME"
	//   "FILTER_DMA_NAME"
	//   "FILTER_TRUEVIEW_IAR_REGION_NAME"
	//   "FILTER_TRUEVIEW_DMA_NAME"
	//   "FILTER_TRUEVIEW_REGION_NAME"
	//   "FILTER_ACTIVE_VIEW_CUSTOM_METRIC_ID"
	//   "FILTER_ACTIVE_VIEW_CUSTOM_METRIC_NAME"
	//   "FILTER_AD_TYPE"
	//   "FILTER_ALGORITHM"
	//   "FILTER_ALGORITHM_ID"
	//   "FILTER_AMP_PAGE_REQUEST"
	//   "FILTER_ANONYMOUS_INVENTORY_MODELING"
	//   "FILTER_APP_URL"
	//   "FILTER_APP_URL_EXCLUDED"
	//   "FILTER_ATTRIBUTED_USERLIST"
	//   "FILTER_ATTRIBUTED_USERLIST_COST"
	//   "FILTER_ATTRIBUTED_USERLIST_TYPE"
	//   "FILTER_ATTRIBUTION_MODEL"
	//   "FILTER_AUDIENCE_LIST"
	//   "FILTER_AUDIENCE_LIST_COST"
	//   "FILTER_AUDIENCE_LIST_TYPE"
	//   "FILTER_AUDIENCE_NAME"
	//   "FILTER_AUDIENCE_TYPE"
	//   "FILTER_BILLABLE_OUTCOME"
	//   "FILTER_BRAND_LIFT_TYPE"
	//   "FILTER_CHANNEL_TYPE"
	//   "FILTER_CM_PLACEMENT_ID"
	//   "FILTER_CONVERSION_SOURCE"
	//   "FILTER_CONVERSION_SOURCE_ID"
	//   "FILTER_COUNTRY_ID"
	//   "FILTER_CREATIVE"
	//   "FILTER_CREATIVE_ASSET"
	//   "FILTER_CREATIVE_INTEGRATION_CODE"
	//   "FILTER_CREATIVE_RENDERED_IN_AMP"
	//   "FILTER_CREATIVE_SOURCE"
	//   "FILTER_CREATIVE_STATUS"
	//   "FILTER_DATA_PROVIDER_NAME"
	//   "FILTER_DETAILED_DEMOGRAPHICS"
	//   "FILTER_DETAILED_DEMOGRAPHICS_ID"
	//   "FILTER_DEVICE"
	//   "FILTER_GAM_INSERTION_ORDER"
	//   "FILTER_GAM_LINE_ITEM"
	//   "FILTER_GAM_LINE_ITEM_ID"
	//   "FILTER_DIGITAL_CONTENT_LABEL"
	//   "FILTER_DOMAIN"
	//   "FILTER_ELIGIBLE_COOKIES_ON_FIRST_PARTY_AUDIENCE_LIST"
	//   "FILTER_ELIGIBLE_COOKIES_ON_THIRD_PARTY_AUDIENCE_LIST_AND_INTEREST"
	//   "FILTER_EXCHANGE"
	//   "FILTER_EXCHANGE_CODE"
	//   "FILTER_EXTENSION"
	//   "FILTER_EXTENSION_STATUS"
	//   "FILTER_EXTENSION_TYPE"
	//   "FILTER_FIRST_PARTY_AUDIENCE_LIST_COST"
	//   "FILTER_FIRST_PARTY_AUDIENCE_LIST_TYPE"
	//   "FILTER_FLOODLIGHT_ACTIVITY"
	//   "FILTER_FORMAT"
	//   "FILTER_GMAIL_AGE"
	//   "FILTER_GMAIL_CITY"
	//   "FILTER_GMAIL_COUNTRY"
	//   "FILTER_GMAIL_COUNTRY_NAME"
	//   "FILTER_GMAIL_DEVICE_TYPE"
	//   "FILTER_GMAIL_DEVICE_TYPE_NAME"
	//   "FILTER_GMAIL_GENDER"
	//   "FILTER_GMAIL_REGION"
	//   "FILTER_GMAIL_REMARKETING_LIST"
	//   "FILTER_HOUSEHOLD_INCOME"
	//   "FILTER_IMPRESSION_COUNTING_METHOD"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_INSERTION_ORDER"
	//   "FILTER_INSERTION_ORDER_INTEGRATION_CODE"
	//   "FILTER_INSERTION_ORDER_STATUS"
	//   "FILTER_INTEREST"
	//   "FILTER_INVENTORY_SOURCE_GROUP"
	//   "FILTER_INVENTORY_SOURCE_GROUP_ID"
	//   "FILTER_INVENTORY_SOURCE_ID"
	//   "FILTER_INVENTORY_SOURCE_NAME"
	//   "FILTER_LIFE_EVENT"
	//   "FILTER_LIFE_EVENTS"
	//   "FILTER_LINE_ITEM_INTEGRATION_CODE"
	//   "FILTER_LINE_ITEM_NAME"
	//   "FILTER_LINE_ITEM_STATUS"
	//   "FILTER_MATCH_RATIO"
	//   "FILTER_MEASUREMENT_SOURCE"
	//   "FILTER_MEDIA_PLAN_NAME"
	//   "FILTER_PARENTAL_STATUS"
	//   "FILTER_PLACEMENT_ALL_YOUTUBE_CHANNELS"
	//   "FILTER_PLATFORM"
	//   "FILTER_PLAYBACK_METHOD"
	//   "FILTER_POSITION_IN_CONTENT"
	//   "FILTER_PUBLISHER_PROPERTY"
	//   "FILTER_PUBLISHER_PROPERTY_ID"
	//   "FILTER_PUBLISHER_PROPERTY_SECTION"
	//   "FILTER_PUBLISHER_PROPERTY_SECTION_ID"
	//   "FILTER_REFUND_REASON"
	//   "FILTER_REMARKETING_LIST"
	//   "FILTER_REWARDED"
	//   "FILTER_SENSITIVE_CATEGORY"
	//   "FILTER_SERVED_PIXEL_DENSITY"
	//   "FILTER_TARGETED_DATA_PROVIDERS"
	//   "FILTER_THIRD_PARTY_AUDIENCE_LIST_COST"
	//   "FILTER_THIRD_PARTY_AUDIENCE_LIST_TYPE"
	//   "FILTER_TRUEVIEW_AD"
	//   "FILTER_TRUEVIEW_AD_GROUP"
	//   "FILTER_TRUEVIEW_DETAILED_DEMOGRAPHICS"
	//   "FILTER_TRUEVIEW_DETAILED_DEMOGRAPHICS_ID"
	//   "FILTER_TRUEVIEW_HOUSEHOLD_INCOME"
	//   "FILTER_TRUEVIEW_IAR_COUNTRY_NAME"
	//   "FILTER_TRUEVIEW_REMARKETING_LIST_NAME"
	//   "FILTER_VARIANT_ID"
	//   "FILTER_VARIANT_NAME"
	//   "FILTER_VARIANT_VERSION"
	//   "FILTER_VERIFICATION_VIDEO_PLAYER_SIZE"
	//   "FILTER_VERIFICATION_VIDEO_POSITION"
	//   "FILTER_VIDEO_COMPANION_CREATIVE_SIZE"
	//   "FILTER_VIDEO_CONTINUOUS_PLAY"
	//   "FILTER_VIDEO_DURATION"
	//   "FILTER_YOUTUBE_ADAPTED_AUDIENCE_LIST"
	//   "FILTER_YOUTUBE_AD_VIDEO"
	//   "FILTER_YOUTUBE_AD_VIDEO_ID"
	//   "FILTER_YOUTUBE_CHANNEL"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_ADVERTISER"
	//   "FILTER_YOUTUBE_PROGRAMMATIC_GUARANTEED_PARTNER"
	//   "FILTER_YOUTUBE_VIDEO"
	//   "FILTER_ZIP_POSTAL_CODE"
	//   "FILTER_PLACEMENT_NAME_ALL_YOUTUBE_CHANNELS"
	//   "FILTER_TRUEVIEW_PLACEMENT_ID"
	//   "FILTER_PATH_PATTERN_ID"
	//   "FILTER_PATH_EVENT_INDEX"
	//   "FILTER_EVENT_TYPE"
	//   "FILTER_CHANNEL_GROUPING"
	Filter string `json:"filter,omitempty"`

	// Match: Indicates how the filter should be matched to the value.
	//
	// Possible values:
	//   "UNKNOWN"
	//   "EXACT"
	//   "PARTIAL"
	//   "BEGINS_WITH"
	//   "WILDCARD_EXPRESSION"
	Match string `json:"match,omitempty"`

	// Values: Value to filter on.
	Values []string `json:"values,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Filter") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Filter") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *PathQueryOptionsFilter) MarshalJSON() ([]byte, error) {
	type NoMethod PathQueryOptionsFilter
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// Query: Represents a query.
type Query struct {
	// Kind: Identifies what kind of resource this is. Value: the fixed
	// string
	// <code>"doubleclickbidmanager#query"</code>.
	Kind string `json:"kind,omitempty"`

	// Metadata: Query metadata.
	Metadata *QueryMetadata `json:"metadata,omitempty"`

	// Params: Query parameters.
	Params *Parameters `json:"params,omitempty"`

	// QueryId: Query ID.
	QueryId int64 `json:"queryId,omitempty,string"`

	// ReportDataEndTimeMs: The ending time for the data that is shown in
	// the report. Note,
	// <code>reportDataEndTimeMs</code> is required
	// if
	// <code>metadata.dataRange</code> is <code>CUSTOM_DATES</code> and
	// ignored
	// otherwise.
	ReportDataEndTimeMs int64 `json:"reportDataEndTimeMs,omitempty,string"`

	// ReportDataStartTimeMs: The starting time for the data that is shown
	// in the report. Note,
	// <code>reportDataStartTimeMs</code> is required
	// if
	// <code>metadata.dataRange</code> is <code>CUSTOM_DATES</code> and
	// ignored
	// otherwise.
	ReportDataStartTimeMs int64 `json:"reportDataStartTimeMs,omitempty,string"`

	// Schedule: Information on how often and when to run a query.
	Schedule *QuerySchedule `json:"schedule,omitempty"`

	// TimezoneCode: Canonical timezone code for report data time. Defaults
	// to
	// <code>America/New_York</code>.
	TimezoneCode string `json:"timezoneCode,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the
	// server.
	googleapi.ServerResponse `json:"-"`

	// ForceSendFields is a list of field names (e.g. "Kind") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Kind") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Query) MarshalJSON() ([]byte, error) {
	type NoMethod Query
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// QueryMetadata: Query metadata.
type QueryMetadata struct {
	// DataRange: Range of report data.
	//
	// Possible values:
	//   "CUSTOM_DATES"
	//   "CURRENT_DAY"
	//   "PREVIOUS_DAY"
	//   "WEEK_TO_DATE"
	//   "MONTH_TO_DATE"
	//   "QUARTER_TO_DATE"
	//   "YEAR_TO_DATE"
	//   "PREVIOUS_WEEK"
	//   "PREVIOUS_HALF_MONTH"
	//   "PREVIOUS_MONTH"
	//   "PREVIOUS_QUARTER"
	//   "PREVIOUS_YEAR"
	//   "LAST_7_DAYS"
	//   "LAST_30_DAYS"
	//   "LAST_90_DAYS"
	//   "LAST_365_DAYS"
	//   "ALL_TIME"
	//   "LAST_14_DAYS"
	//   "TYPE_NOT_SUPPORTED"
	//   "LAST_60_DAYS"
	DataRange string `json:"dataRange,omitempty"`

	// Format: Format of the generated report.
	//
	// Possible values:
	//   "CSV"
	//   "EXCEL_CSV"
	//   "XLSX"
	Format string `json:"format,omitempty"`

	// GoogleCloudStoragePathForLatestReport: The path to the location in
	// Google Cloud Storage where the latest report is
	// stored.
	GoogleCloudStoragePathForLatestReport string `json:"googleCloudStoragePathForLatestReport,omitempty"`

	// GoogleDrivePathForLatestReport: The path in Google Drive for the
	// latest report.
	GoogleDrivePathForLatestReport string `json:"googleDrivePathForLatestReport,omitempty"`

	// LatestReportRunTimeMs: The time when the latest report started to
	// run.
	LatestReportRunTimeMs int64 `json:"latestReportRunTimeMs,omitempty,string"`

	// Locale: Locale of the generated reports. Valid values are cs
	// CZECH de
	// GERMAN en      ENGLISH es      SPANISH fr      FRENCH it      ITALIAN
	// ja
	// JAPANESE ko      KOREAN pl      POLISH pt-BR   BRAZILIAN_PORTUGUESE
	// ru
	// RUSSIAN tr      TURKISH uk      UKRAINIAN zh-CN   CHINA_CHINESE
	// zh-TW
	// TAIWAN_CHINESE <br><br> An locale string not in the list above
	// will
	// generate reports in English.
	Locale string `json:"locale,omitempty"`

	// ReportCount: Number of reports that have been generated for the
	// query.
	ReportCount int64 `json:"reportCount,omitempty"`

	// Running: Whether the latest report is currently running.
	Running bool `json:"running,omitempty"`

	// SendNotification: Whether to send an email notification when a report
	// is ready. Default to
	// false.
	SendNotification bool `json:"sendNotification,omitempty"`

	// ShareEmailAddress: List of email addresses which are sent email
	// notifications when the report
	// is finished. Separate from <code>sendNotification</code>.
	ShareEmailAddress []string `json:"shareEmailAddress,omitempty"`

	// Title: Query title. It is used to name the reports generated from
	// this query.
	Title string `json:"title,omitempty"`

	// ForceSendFields is a list of field names (e.g. "DataRange") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "DataRange") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *QueryMetadata) MarshalJSON() ([]byte, error) {
	type NoMethod QueryMetadata
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// QuerySchedule: Information on how frequently and when to run a query.
type QuerySchedule struct {
	// EndTimeMs: Datetime to periodically run the query until.
	EndTimeMs int64 `json:"endTimeMs,omitempty,string"`

	// Frequency: How often the query is run.
	//
	// Possible values:
	//   "ONE_TIME"
	//   "DAILY"
	//   "WEEKLY"
	//   "SEMI_MONTHLY"
	//   "MONTHLY"
	//   "QUARTERLY"
	Frequency string `json:"frequency,omitempty"`

	// NextRunMinuteOfDay: Time of day at which a new report will be
	// generated, represented as minutes
	// past midnight. Range is 0 to 1439. Only applies to scheduled reports.
	NextRunMinuteOfDay int64 `json:"nextRunMinuteOfDay,omitempty"`

	// NextRunTimezoneCode: Canonical timezone code for report generation
	// time. Defaults to
	// <code>America/New_York</code>.
	NextRunTimezoneCode string `json:"nextRunTimezoneCode,omitempty"`

	// StartTimeMs: When to start running the query. Not applicable to
	// `ONE_TIME` frequency.
	StartTimeMs int64 `json:"startTimeMs,omitempty,string"`

	// ForceSendFields is a list of field names (e.g. "EndTimeMs") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "EndTimeMs") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *QuerySchedule) MarshalJSON() ([]byte, error) {
	type NoMethod QuerySchedule
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// Report: Represents a report.
type Report struct {
	// Key: Key used to identify a report.
	Key *ReportKey `json:"key,omitempty"`

	// Metadata: Report metadata.
	Metadata *ReportMetadata `json:"metadata,omitempty"`

	// Params: Report parameters.
	Params *Parameters `json:"params,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Key") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Key") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Report) MarshalJSON() ([]byte, error) {
	type NoMethod Report
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ReportFailure: An explanation of a report failure.
type ReportFailure struct {
	// ErrorCode: Error code that shows why the report was not created.
	//
	// Possible values:
	//   "AUTHENTICATION_ERROR"
	//   "UNAUTHORIZED_API_ACCESS"
	//   "SERVER_ERROR"
	//   "VALIDATION_ERROR"
	//   "REPORTING_FATAL_ERROR"
	//   "REPORTING_TRANSIENT_ERROR"
	//   "REPORTING_IMCOMPATIBLE_METRICS"
	//   "REPORTING_ILLEGAL_FILENAME"
	//   "REPORTING_QUERY_NOT_FOUND"
	//   "REPORTING_BUCKET_NOT_FOUND"
	//   "REPORTING_CREATE_BUCKET_FAILED"
	//   "REPORTING_DELETE_BUCKET_FAILED"
	//   "REPORTING_UPDATE_BUCKET_PERMISSION_FAILED"
	//   "REPORTING_WRITE_BUCKET_OBJECT_FAILED"
	//   "DEPRECATED_REPORTING_INVALID_QUERY"
	//   "REPORTING_INVALID_QUERY_TOO_MANY_UNFILTERED_LARGE_GROUP_BYS"
	//   "REPORTING_INVALID_QUERY_TITLE_MISSING"
	//   "REPORTING_INVALID_QUERY_MISSING_PARTNER_AND_ADVERTISER_FILTERS"
	ErrorCode string `json:"errorCode,omitempty"`

	// ForceSendFields is a list of field names (e.g. "ErrorCode") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "ErrorCode") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ReportFailure) MarshalJSON() ([]byte, error) {
	type NoMethod ReportFailure
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ReportKey: Key used to identify a report.
type ReportKey struct {
	// QueryId: Query ID.
	QueryId int64 `json:"queryId,omitempty,string"`

	// ReportId: Report ID.
	ReportId int64 `json:"reportId,omitempty,string"`

	// ForceSendFields is a list of field names (e.g. "QueryId") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "QueryId") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ReportKey) MarshalJSON() ([]byte, error) {
	type NoMethod ReportKey
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ReportMetadata: Report metadata.
type ReportMetadata struct {
	// GoogleCloudStoragePath: The path to the location in Google Cloud
	// Storage where the report is
	// stored.
	GoogleCloudStoragePath string `json:"googleCloudStoragePath,omitempty"`

	// ReportDataEndTimeMs: The ending time for the data that is shown in
	// the report.
	ReportDataEndTimeMs int64 `json:"reportDataEndTimeMs,omitempty,string"`

	// ReportDataStartTimeMs: The starting time for the data that is shown
	// in the report.
	ReportDataStartTimeMs int64 `json:"reportDataStartTimeMs,omitempty,string"`

	// Status: Report status.
	Status *ReportStatus `json:"status,omitempty"`

	// ForceSendFields is a list of field names (e.g.
	// "GoogleCloudStoragePath") to unconditionally include in API requests.
	// By default, fields with empty values are omitted from API requests.
	// However, any non-pointer, non-interface field appearing in
	// ForceSendFields will be sent to the server regardless of whether the
	// field is empty or not. This may be used to include empty fields in
	// Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "GoogleCloudStoragePath")
	// to include in API requests with the JSON null value. By default,
	// fields with empty values are omitted from API requests. However, any
	// field with an empty value appearing in NullFields will be sent to the
	// server as null. It is an error if a field in this list has a
	// non-empty value. This may be used to include null fields in Patch
	// requests.
	NullFields []string `json:"-"`
}

func (s *ReportMetadata) MarshalJSON() ([]byte, error) {
	type NoMethod ReportMetadata
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// ReportStatus: Report status.
type ReportStatus struct {
	// Failure: If the report failed, this records the cause.
	Failure *ReportFailure `json:"failure,omitempty"`

	// FinishTimeMs: The time when this report either completed successfully
	// or failed.
	FinishTimeMs int64 `json:"finishTimeMs,omitempty,string"`

	// Format: The file type of the report.
	//
	// Possible values:
	//   "CSV"
	//   "EXCEL_CSV"
	//   "XLSX"
	Format string `json:"format,omitempty"`

	// State: The state of the report.
	//
	// Possible values:
	//   "RUNNING"
	//   "DONE"
	//   "FAILED"
	State string `json:"state,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Failure") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Failure") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *ReportStatus) MarshalJSON() ([]byte, error) {
	type NoMethod ReportStatus
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// RowStatus: Represents the upload status of a row in the request.
type RowStatus struct {
	// Changed: Whether the stored entity is changed as a result of upload.
	Changed bool `json:"changed,omitempty"`

	// EntityId: Entity Id.
	EntityId int64 `json:"entityId,omitempty,string"`

	// EntityName: Entity name.
	EntityName string `json:"entityName,omitempty"`

	// Errors: Reasons why the entity can't be uploaded.
	Errors []string `json:"errors,omitempty"`

	// Persisted: Whether the entity is persisted.
	Persisted bool `json:"persisted,omitempty"`

	// RowNumber: Row number.
	RowNumber int64 `json:"rowNumber,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Changed") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Changed") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *RowStatus) MarshalJSON() ([]byte, error) {
	type NoMethod RowStatus
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// Rule: A Rule defines a name, and a boolean expression in [conjunctive
// normal
// form](http:
// //mathworld.wolfram.com/ConjunctiveNormalForm.html)
// {.external} that can be
// // applied to a path event to determine if that name should be
// applied.
type Rule struct {
	DisjunctiveMatchStatements []*DisjunctiveMatchStatement `json:"disjunctiveMatchStatements,omitempty"`

	// Name: Rule name.
	Name string `json:"name,omitempty"`

	// ForceSendFields is a list of field names (e.g.
	// "DisjunctiveMatchStatements") to unconditionally include in API
	// requests. By default, fields with empty values are omitted from API
	// requests. However, any non-pointer, non-interface field appearing in
	// ForceSendFields will be sent to the server regardless of whether the
	// field is empty or not. This may be used to include empty fields in
	// Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g.
	// "DisjunctiveMatchStatements") to include in API requests with the
	// JSON null value. By default, fields with empty values are omitted
	// from API requests. However, any field with an empty value appearing
	// in NullFields will be sent to the server as null. It is an error if a
	// field in this list has a non-empty value. This may be used to include
	// null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *Rule) MarshalJSON() ([]byte, error) {
	type NoMethod Rule
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// RunQueryRequest: Request to run a stored query to generate a report.
type RunQueryRequest struct {
	// DataRange: Report data range used to generate the report.
	//
	// Possible values:
	//   "CUSTOM_DATES"
	//   "CURRENT_DAY"
	//   "PREVIOUS_DAY"
	//   "WEEK_TO_DATE"
	//   "MONTH_TO_DATE"
	//   "QUARTER_TO_DATE"
	//   "YEAR_TO_DATE"
	//   "PREVIOUS_WEEK"
	//   "PREVIOUS_HALF_MONTH"
	//   "PREVIOUS_MONTH"
	//   "PREVIOUS_QUARTER"
	//   "PREVIOUS_YEAR"
	//   "LAST_7_DAYS"
	//   "LAST_30_DAYS"
	//   "LAST_90_DAYS"
	//   "LAST_365_DAYS"
	//   "ALL_TIME"
	//   "LAST_14_DAYS"
	//   "TYPE_NOT_SUPPORTED"
	//   "LAST_60_DAYS"
	DataRange string `json:"dataRange,omitempty"`

	// ReportDataEndTimeMs: The ending time for the data that is shown in
	// the report. Note,
	// <code>reportDataEndTimeMs</code> is required if
	// <code>dataRange</code> is
	// <code>CUSTOM_DATES</code> and ignored otherwise.
	ReportDataEndTimeMs int64 `json:"reportDataEndTimeMs,omitempty,string"`

	// ReportDataStartTimeMs: The starting time for the data that is shown
	// in the report. Note,
	// <code>reportDataStartTimeMs</code> is required if
	// <code>dataRange</code> is
	// <code>CUSTOM_DATES</code> and ignored otherwise.
	ReportDataStartTimeMs int64 `json:"reportDataStartTimeMs,omitempty,string"`

	// TimezoneCode: Canonical timezone code for report data time. Defaults
	// to
	// <code>America/New_York</code>.
	TimezoneCode string `json:"timezoneCode,omitempty"`

	// ForceSendFields is a list of field names (e.g. "DataRange") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "DataRange") to include in
	// API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *RunQueryRequest) MarshalJSON() ([]byte, error) {
	type NoMethod RunQueryRequest
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// UploadLineItemsRequest: Request to upload line items.
type UploadLineItemsRequest struct {
	// DryRun: Set to <code>true</code> to get upload status without
	// actually persisting
	// the line items.
	DryRun bool `json:"dryRun,omitempty"`

	// Format: Format the line items are in. Default to <code>CSV</code>.
	//
	// Possible values:
	//   "CSV"
	Format string `json:"format,omitempty"`

	// LineItems: Line items in CSV to upload. Refer to
	// <a
	// href="https://developers.google.com/bid-manager/guides/entity-write
	// /format">
	// Entity Write File Format</a> for more information on file format.
	LineItems string `json:"lineItems,omitempty"`

	// ForceSendFields is a list of field names (e.g. "DryRun") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "DryRun") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *UploadLineItemsRequest) MarshalJSON() ([]byte, error) {
	type NoMethod UploadLineItemsRequest
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// UploadLineItemsResponse: Upload line items response.
type UploadLineItemsResponse struct {
	// UploadStatus: Status of upload.
	UploadStatus *UploadStatus `json:"uploadStatus,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the
	// server.
	googleapi.ServerResponse `json:"-"`

	// ForceSendFields is a list of field names (e.g. "UploadStatus") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "UploadStatus") to include
	// in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. However, any field with
	// an empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *UploadLineItemsResponse) MarshalJSON() ([]byte, error) {
	type NoMethod UploadLineItemsResponse
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// UploadStatus: Represents the status of upload.
type UploadStatus struct {
	// Errors: Reasons why upload can't be completed.
	Errors []string `json:"errors,omitempty"`

	// RowStatus: Per-row upload status.
	RowStatus []*RowStatus `json:"rowStatus,omitempty"`

	// ForceSendFields is a list of field names (e.g. "Errors") to
	// unconditionally include in API requests. By default, fields with
	// empty values are omitted from API requests. However, any non-pointer,
	// non-interface field appearing in ForceSendFields will be sent to the
	// server regardless of whether the field is empty or not. This may be
	// used to include empty fields in Patch requests.
	ForceSendFields []string `json:"-"`

	// NullFields is a list of field names (e.g. "Errors") to include in API
	// requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. However, any field with an
	// empty value appearing in NullFields will be sent to the server as
	// null. It is an error if a field in this list has a non-empty value.
	// This may be used to include null fields in Patch requests.
	NullFields []string `json:"-"`
}

func (s *UploadStatus) MarshalJSON() ([]byte, error) {
	type NoMethod UploadStatus
	raw := NoMethod(*s)
	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

// method id "doubleclickbidmanager.lineitems.downloadlineitems":

type LineitemsDownloadlineitemsCall struct {
	s                        *Service
	downloadlineitemsrequest *DownloadLineItemsRequest
	urlParams_               gensupport.URLParams
	ctx_                     context.Context
	header_                  http.Header
}

// Downloadlineitems: Retrieves line items in CSV format. YouTube &
// partners line items are not
// supported.
func (r *LineitemsService) Downloadlineitems(downloadlineitemsrequest *DownloadLineItemsRequest) *LineitemsDownloadlineitemsCall {
	c := &LineitemsDownloadlineitemsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.downloadlineitemsrequest = downloadlineitemsrequest
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *LineitemsDownloadlineitemsCall) Fields(s ...googleapi.Field) *LineitemsDownloadlineitemsCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *LineitemsDownloadlineitemsCall) Context(ctx context.Context) *LineitemsDownloadlineitemsCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *LineitemsDownloadlineitemsCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *LineitemsDownloadlineitemsCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	var body io.Reader = nil
	body, err := googleapi.WithoutDataWrapper.JSONReader(c.downloadlineitemsrequest)
	if err != nil {
		return nil, err
	}
	reqHeaders.Set("Content-Type", "application/json")
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/lineitems/downloadlineitems")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("POST", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.lineitems.downloadlineitems" call.
// Exactly one of *DownloadLineItemsResponse or error will be non-nil.
// Any non-2xx status code is an error. Response headers are in either
// *DownloadLineItemsResponse.ServerResponse.Header or (if a response
// was returned at all) in error.(*googleapi.Error).Header. Use
// googleapi.IsNotModified to check whether the returned error was
// because http.StatusNotModified was returned.
func (c *LineitemsDownloadlineitemsCall) Do(opts ...googleapi.CallOption) (*DownloadLineItemsResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &DownloadLineItemsResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Retrieves line items in CSV format. YouTube \u0026 partners line items are not\nsupported.",
	//   "flatPath": "doubleclickbidmanager/v1.1/lineitems/downloadlineitems",
	//   "httpMethod": "POST",
	//   "id": "doubleclickbidmanager.lineitems.downloadlineitems",
	//   "parameterOrder": [],
	//   "parameters": {},
	//   "path": "doubleclickbidmanager/v1.1/lineitems/downloadlineitems",
	//   "request": {
	//     "$ref": "DownloadLineItemsRequest"
	//   },
	//   "response": {
	//     "$ref": "DownloadLineItemsResponse"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// method id "doubleclickbidmanager.lineitems.uploadlineitems":

type LineitemsUploadlineitemsCall struct {
	s                      *Service
	uploadlineitemsrequest *UploadLineItemsRequest
	urlParams_             gensupport.URLParams
	ctx_                   context.Context
	header_                http.Header
}

// Uploadlineitems: Uploads line items in CSV format. YouTube & partners
// line items are not
// supported.
func (r *LineitemsService) Uploadlineitems(uploadlineitemsrequest *UploadLineItemsRequest) *LineitemsUploadlineitemsCall {
	c := &LineitemsUploadlineitemsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.uploadlineitemsrequest = uploadlineitemsrequest
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *LineitemsUploadlineitemsCall) Fields(s ...googleapi.Field) *LineitemsUploadlineitemsCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *LineitemsUploadlineitemsCall) Context(ctx context.Context) *LineitemsUploadlineitemsCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *LineitemsUploadlineitemsCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *LineitemsUploadlineitemsCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	var body io.Reader = nil
	body, err := googleapi.WithoutDataWrapper.JSONReader(c.uploadlineitemsrequest)
	if err != nil {
		return nil, err
	}
	reqHeaders.Set("Content-Type", "application/json")
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/lineitems/uploadlineitems")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("POST", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.lineitems.uploadlineitems" call.
// Exactly one of *UploadLineItemsResponse or error will be non-nil. Any
// non-2xx status code is an error. Response headers are in either
// *UploadLineItemsResponse.ServerResponse.Header or (if a response was
// returned at all) in error.(*googleapi.Error).Header. Use
// googleapi.IsNotModified to check whether the returned error was
// because http.StatusNotModified was returned.
func (c *LineitemsUploadlineitemsCall) Do(opts ...googleapi.CallOption) (*UploadLineItemsResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &UploadLineItemsResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Uploads line items in CSV format. YouTube \u0026 partners line items are not\nsupported.",
	//   "flatPath": "doubleclickbidmanager/v1.1/lineitems/uploadlineitems",
	//   "httpMethod": "POST",
	//   "id": "doubleclickbidmanager.lineitems.uploadlineitems",
	//   "parameterOrder": [],
	//   "parameters": {},
	//   "path": "doubleclickbidmanager/v1.1/lineitems/uploadlineitems",
	//   "request": {
	//     "$ref": "UploadLineItemsRequest"
	//   },
	//   "response": {
	//     "$ref": "UploadLineItemsResponse"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// method id "doubleclickbidmanager.queries.createquery":

type QueriesCreatequeryCall struct {
	s          *Service
	query      *Query
	urlParams_ gensupport.URLParams
	ctx_       context.Context
	header_    http.Header
}

// Createquery: Creates a query.
func (r *QueriesService) Createquery(query *Query) *QueriesCreatequeryCall {
	c := &QueriesCreatequeryCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.query = query
	return c
}

// Asynchronous sets the optional parameter "asynchronous": If true,
// tries to run the query asynchronously. Only applicable when
// the frequency is <code>ONE_TIME</code>.
func (c *QueriesCreatequeryCall) Asynchronous(asynchronous bool) *QueriesCreatequeryCall {
	c.urlParams_.Set("asynchronous", fmt.Sprint(asynchronous))
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *QueriesCreatequeryCall) Fields(s ...googleapi.Field) *QueriesCreatequeryCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *QueriesCreatequeryCall) Context(ctx context.Context) *QueriesCreatequeryCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *QueriesCreatequeryCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *QueriesCreatequeryCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	var body io.Reader = nil
	body, err := googleapi.WithoutDataWrapper.JSONReader(c.query)
	if err != nil {
		return nil, err
	}
	reqHeaders.Set("Content-Type", "application/json")
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/query")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("POST", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.queries.createquery" call.
// Exactly one of *Query or error will be non-nil. Any non-2xx status
// code is an error. Response headers are in either
// *Query.ServerResponse.Header or (if a response was returned at all)
// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
// check whether the returned error was because http.StatusNotModified
// was returned.
func (c *QueriesCreatequeryCall) Do(opts ...googleapi.CallOption) (*Query, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &Query{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Creates a query.",
	//   "flatPath": "doubleclickbidmanager/v1.1/query",
	//   "httpMethod": "POST",
	//   "id": "doubleclickbidmanager.queries.createquery",
	//   "parameterOrder": [],
	//   "parameters": {
	//     "asynchronous": {
	//       "default": "false",
	//       "description": "If true, tries to run the query asynchronously. Only applicable when\nthe frequency is \u003ccode\u003eONE_TIME\u003c/code\u003e.",
	//       "location": "query",
	//       "type": "boolean"
	//     }
	//   },
	//   "path": "doubleclickbidmanager/v1.1/query",
	//   "request": {
	//     "$ref": "Query"
	//   },
	//   "response": {
	//     "$ref": "Query"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// method id "doubleclickbidmanager.queries.deletequery":

type QueriesDeletequeryCall struct {
	s          *Service
	queryId    int64
	urlParams_ gensupport.URLParams
	ctx_       context.Context
	header_    http.Header
}

// Deletequery: Deletes a stored query as well as the associated stored
// reports.
func (r *QueriesService) Deletequery(queryId int64) *QueriesDeletequeryCall {
	c := &QueriesDeletequeryCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.queryId = queryId
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *QueriesDeletequeryCall) Fields(s ...googleapi.Field) *QueriesDeletequeryCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *QueriesDeletequeryCall) Context(ctx context.Context) *QueriesDeletequeryCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *QueriesDeletequeryCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *QueriesDeletequeryCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/query/{queryId}")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("DELETE", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"queryId": strconv.FormatInt(c.queryId, 10),
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.queries.deletequery" call.
func (c *QueriesDeletequeryCall) Do(opts ...googleapi.CallOption) error {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if err != nil {
		return err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return err
	}
	return nil
	// {
	//   "description": "Deletes a stored query as well as the associated stored reports.",
	//   "flatPath": "doubleclickbidmanager/v1.1/query/{queryId}",
	//   "httpMethod": "DELETE",
	//   "id": "doubleclickbidmanager.queries.deletequery",
	//   "parameterOrder": [
	//     "queryId"
	//   ],
	//   "parameters": {
	//     "queryId": {
	//       "description": "Query ID to delete.",
	//       "format": "int64",
	//       "location": "path",
	//       "required": true,
	//       "type": "string"
	//     }
	//   },
	//   "path": "doubleclickbidmanager/v1.1/query/{queryId}",
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// method id "doubleclickbidmanager.queries.getquery":

type QueriesGetqueryCall struct {
	s            *Service
	queryId      int64
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// Getquery: Retrieves a stored query.
func (r *QueriesService) Getquery(queryId int64) *QueriesGetqueryCall {
	c := &QueriesGetqueryCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.queryId = queryId
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *QueriesGetqueryCall) Fields(s ...googleapi.Field) *QueriesGetqueryCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets the optional parameter which makes the operation
// fail if the object's ETag matches the given value. This is useful for
// getting updates only after the object has changed since the last
// request. Use googleapi.IsNotModified to check whether the response
// error from Do is the result of In-None-Match.
func (c *QueriesGetqueryCall) IfNoneMatch(entityTag string) *QueriesGetqueryCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *QueriesGetqueryCall) Context(ctx context.Context) *QueriesGetqueryCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *QueriesGetqueryCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *QueriesGetqueryCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/query/{queryId}")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"queryId": strconv.FormatInt(c.queryId, 10),
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.queries.getquery" call.
// Exactly one of *Query or error will be non-nil. Any non-2xx status
// code is an error. Response headers are in either
// *Query.ServerResponse.Header or (if a response was returned at all)
// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
// check whether the returned error was because http.StatusNotModified
// was returned.
func (c *QueriesGetqueryCall) Do(opts ...googleapi.CallOption) (*Query, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &Query{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Retrieves a stored query.",
	//   "flatPath": "doubleclickbidmanager/v1.1/query/{queryId}",
	//   "httpMethod": "GET",
	//   "id": "doubleclickbidmanager.queries.getquery",
	//   "parameterOrder": [
	//     "queryId"
	//   ],
	//   "parameters": {
	//     "queryId": {
	//       "description": "Query ID to retrieve.",
	//       "format": "int64",
	//       "location": "path",
	//       "required": true,
	//       "type": "string"
	//     }
	//   },
	//   "path": "doubleclickbidmanager/v1.1/query/{queryId}",
	//   "response": {
	//     "$ref": "Query"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// method id "doubleclickbidmanager.queries.listqueries":

type QueriesListqueriesCall struct {
	s            *Service
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// Listqueries: Retrieves stored queries.
func (r *QueriesService) Listqueries() *QueriesListqueriesCall {
	c := &QueriesListqueriesCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	return c
}

// PageSize sets the optional parameter "pageSize": Maximum number of
// results per page. Must be between <code>1</code>
// and
// <code>100</code>. Defaults to <code>100</code> if unspecified.
func (c *QueriesListqueriesCall) PageSize(pageSize int64) *QueriesListqueriesCall {
	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
	return c
}

// PageToken sets the optional parameter "pageToken": Optional
// pagination token.
func (c *QueriesListqueriesCall) PageToken(pageToken string) *QueriesListqueriesCall {
	c.urlParams_.Set("pageToken", pageToken)
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *QueriesListqueriesCall) Fields(s ...googleapi.Field) *QueriesListqueriesCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets the optional parameter which makes the operation
// fail if the object's ETag matches the given value. This is useful for
// getting updates only after the object has changed since the last
// request. Use googleapi.IsNotModified to check whether the response
// error from Do is the result of In-None-Match.
func (c *QueriesListqueriesCall) IfNoneMatch(entityTag string) *QueriesListqueriesCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *QueriesListqueriesCall) Context(ctx context.Context) *QueriesListqueriesCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *QueriesListqueriesCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *QueriesListqueriesCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/queries")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.queries.listqueries" call.
// Exactly one of *ListQueriesResponse or error will be non-nil. Any
// non-2xx status code is an error. Response headers are in either
// *ListQueriesResponse.ServerResponse.Header or (if a response was
// returned at all) in error.(*googleapi.Error).Header. Use
// googleapi.IsNotModified to check whether the returned error was
// because http.StatusNotModified was returned.
func (c *QueriesListqueriesCall) Do(opts ...googleapi.CallOption) (*ListQueriesResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &ListQueriesResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Retrieves stored queries.",
	//   "flatPath": "doubleclickbidmanager/v1.1/queries",
	//   "httpMethod": "GET",
	//   "id": "doubleclickbidmanager.queries.listqueries",
	//   "parameterOrder": [],
	//   "parameters": {
	//     "pageSize": {
	//       "description": "Maximum number of results per page. Must be between \u003ccode\u003e1\u003c/code\u003e and\n\u003ccode\u003e100\u003c/code\u003e. Defaults to \u003ccode\u003e100\u003c/code\u003e if unspecified.",
	//       "format": "int32",
	//       "location": "query",
	//       "type": "integer"
	//     },
	//     "pageToken": {
	//       "description": "Optional pagination token.",
	//       "location": "query",
	//       "type": "string"
	//     }
	//   },
	//   "path": "doubleclickbidmanager/v1.1/queries",
	//   "response": {
	//     "$ref": "ListQueriesResponse"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// Pages invokes f for each page of results.
// A non-nil error returned from f will halt the iteration.
// The provided context supersedes any context provided to the Context method.
func (c *QueriesListqueriesCall) Pages(ctx context.Context, f func(*ListQueriesResponse) error) error {
	c.ctx_ = ctx
	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
	for {
		x, err := c.Do()
		if err != nil {
			return err
		}
		if err := f(x); err != nil {
			return err
		}
		if x.NextPageToken == "" {
			return nil
		}
		c.PageToken(x.NextPageToken)
	}
}

// method id "doubleclickbidmanager.queries.runquery":

type QueriesRunqueryCall struct {
	s               *Service
	queryId         int64
	runqueryrequest *RunQueryRequest
	urlParams_      gensupport.URLParams
	ctx_            context.Context
	header_         http.Header
}

// Runquery: Runs a stored query to generate a report.
func (r *QueriesService) Runquery(queryId int64, runqueryrequest *RunQueryRequest) *QueriesRunqueryCall {
	c := &QueriesRunqueryCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.queryId = queryId
	c.runqueryrequest = runqueryrequest
	return c
}

// Asynchronous sets the optional parameter "asynchronous": If true,
// tries to run the query asynchronously.
func (c *QueriesRunqueryCall) Asynchronous(asynchronous bool) *QueriesRunqueryCall {
	c.urlParams_.Set("asynchronous", fmt.Sprint(asynchronous))
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *QueriesRunqueryCall) Fields(s ...googleapi.Field) *QueriesRunqueryCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *QueriesRunqueryCall) Context(ctx context.Context) *QueriesRunqueryCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *QueriesRunqueryCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *QueriesRunqueryCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	var body io.Reader = nil
	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runqueryrequest)
	if err != nil {
		return nil, err
	}
	reqHeaders.Set("Content-Type", "application/json")
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/query/{queryId}")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("POST", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"queryId": strconv.FormatInt(c.queryId, 10),
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.queries.runquery" call.
func (c *QueriesRunqueryCall) Do(opts ...googleapi.CallOption) error {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if err != nil {
		return err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return err
	}
	return nil
	// {
	//   "description": "Runs a stored query to generate a report.",
	//   "flatPath": "doubleclickbidmanager/v1.1/query/{queryId}",
	//   "httpMethod": "POST",
	//   "id": "doubleclickbidmanager.queries.runquery",
	//   "parameterOrder": [
	//     "queryId"
	//   ],
	//   "parameters": {
	//     "asynchronous": {
	//       "default": "false",
	//       "description": "If true, tries to run the query asynchronously.",
	//       "location": "query",
	//       "type": "boolean"
	//     },
	//     "queryId": {
	//       "description": "Query ID to run.",
	//       "format": "int64",
	//       "location": "path",
	//       "required": true,
	//       "type": "string"
	//     }
	//   },
	//   "path": "doubleclickbidmanager/v1.1/query/{queryId}",
	//   "request": {
	//     "$ref": "RunQueryRequest"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// method id "doubleclickbidmanager.reports.listreports":

type ReportsListreportsCall struct {
	s            *Service
	queryId      int64
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// Listreports: Retrieves stored reports.
func (r *ReportsService) Listreports(queryId int64) *ReportsListreportsCall {
	c := &ReportsListreportsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.queryId = queryId
	return c
}

// PageSize sets the optional parameter "pageSize": Maximum number of
// results per page. Must be between <code>1</code>
// and
// <code>100</code>. Defaults to <code>100</code> if unspecified.
func (c *ReportsListreportsCall) PageSize(pageSize int64) *ReportsListreportsCall {
	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
	return c
}

// PageToken sets the optional parameter "pageToken": Optional
// pagination token.
func (c *ReportsListreportsCall) PageToken(pageToken string) *ReportsListreportsCall {
	c.urlParams_.Set("pageToken", pageToken)
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *ReportsListreportsCall) Fields(s ...googleapi.Field) *ReportsListreportsCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets the optional parameter which makes the operation
// fail if the object's ETag matches the given value. This is useful for
// getting updates only after the object has changed since the last
// request. Use googleapi.IsNotModified to check whether the response
// error from Do is the result of In-None-Match.
func (c *ReportsListreportsCall) IfNoneMatch(entityTag string) *ReportsListreportsCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *ReportsListreportsCall) Context(ctx context.Context) *ReportsListreportsCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *ReportsListreportsCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *ReportsListreportsCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/queries/{queryId}/reports")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"queryId": strconv.FormatInt(c.queryId, 10),
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.reports.listreports" call.
// Exactly one of *ListReportsResponse or error will be non-nil. Any
// non-2xx status code is an error. Response headers are in either
// *ListReportsResponse.ServerResponse.Header or (if a response was
// returned at all) in error.(*googleapi.Error).Header. Use
// googleapi.IsNotModified to check whether the returned error was
// because http.StatusNotModified was returned.
func (c *ReportsListreportsCall) Do(opts ...googleapi.CallOption) (*ListReportsResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &ListReportsResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Retrieves stored reports.",
	//   "flatPath": "doubleclickbidmanager/v1.1/queries/{queryId}/reports",
	//   "httpMethod": "GET",
	//   "id": "doubleclickbidmanager.reports.listreports",
	//   "parameterOrder": [
	//     "queryId"
	//   ],
	//   "parameters": {
	//     "pageSize": {
	//       "description": "Maximum number of results per page. Must be between \u003ccode\u003e1\u003c/code\u003e and\n\u003ccode\u003e100\u003c/code\u003e. Defaults to \u003ccode\u003e100\u003c/code\u003e if unspecified.",
	//       "format": "int32",
	//       "location": "query",
	//       "type": "integer"
	//     },
	//     "pageToken": {
	//       "description": "Optional pagination token.",
	//       "location": "query",
	//       "type": "string"
	//     },
	//     "queryId": {
	//       "description": "Query ID with which the reports are associated.",
	//       "format": "int64",
	//       "location": "path",
	//       "required": true,
	//       "type": "string"
	//     }
	//   },
	//   "path": "doubleclickbidmanager/v1.1/queries/{queryId}/reports",
	//   "response": {
	//     "$ref": "ListReportsResponse"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}

// Pages invokes f for each page of results.
// A non-nil error returned from f will halt the iteration.
// The provided context supersedes any context provided to the Context method.
func (c *ReportsListreportsCall) Pages(ctx context.Context, f func(*ListReportsResponse) error) error {
	c.ctx_ = ctx
	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
	for {
		x, err := c.Do()
		if err != nil {
			return err
		}
		if err := f(x); err != nil {
			return err
		}
		if x.NextPageToken == "" {
			return nil
		}
		c.PageToken(x.NextPageToken)
	}
}

// method id "doubleclickbidmanager.sdf.download":

type SdfDownloadCall struct {
	s               *Service
	downloadrequest *DownloadRequest
	urlParams_      gensupport.URLParams
	ctx_            context.Context
	header_         http.Header
}

// Download: Retrieves entities in SDF format.
func (r *SdfService) Download(downloadrequest *DownloadRequest) *SdfDownloadCall {
	c := &SdfDownloadCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.downloadrequest = downloadrequest
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
// for more information.
func (c *SdfDownloadCall) Fields(s ...googleapi.Field) *SdfDownloadCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method. Any
// pending HTTP request will be aborted if the provided context is
// canceled.
func (c *SdfDownloadCall) Context(ctx context.Context) *SdfDownloadCall {
	c.ctx_ = ctx
	return c
}

// Header returns an http.Header that can be modified by the caller to
// add HTTP headers to the request.
func (c *SdfDownloadCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *SdfDownloadCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := make(http.Header)
	reqHeaders.Set("x-goog-api-client", "gl-go/"+gensupport.GoVersion()+" gdcl/20200805")
	for k, v := range c.header_ {
		reqHeaders[k] = v
	}
	reqHeaders.Set("User-Agent", c.s.userAgent())
	var body io.Reader = nil
	body, err := googleapi.WithoutDataWrapper.JSONReader(c.downloadrequest)
	if err != nil {
		return nil, err
	}
	reqHeaders.Set("Content-Type", "application/json")
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "doubleclickbidmanager/v1.1/sdf/download")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("POST", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "doubleclickbidmanager.sdf.download" call.
// Exactly one of *DownloadResponse or error will be non-nil. Any
// non-2xx status code is an error. Response headers are in either
// *DownloadResponse.ServerResponse.Header or (if a response was
// returned at all) in error.(*googleapi.Error).Header. Use
// googleapi.IsNotModified to check whether the returned error was
// because http.StatusNotModified was returned.
func (c *SdfDownloadCall) Do(opts ...googleapi.CallOption) (*DownloadResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, &googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		}
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, err
	}
	ret := &DownloadResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
	// {
	//   "description": "Retrieves entities in SDF format.",
	//   "flatPath": "doubleclickbidmanager/v1.1/sdf/download",
	//   "httpMethod": "POST",
	//   "id": "doubleclickbidmanager.sdf.download",
	//   "parameterOrder": [],
	//   "parameters": {},
	//   "path": "doubleclickbidmanager/v1.1/sdf/download",
	//   "request": {
	//     "$ref": "DownloadRequest"
	//   },
	//   "response": {
	//     "$ref": "DownloadResponse"
	//   },
	//   "scopes": [
	//     "https://www.googleapis.com/auth/doubleclickbidmanager"
	//   ]
	// }

}
