# Copyright 2015 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
require 'date'
require 'google/apis/core/base_service'
require 'google/apis/core/json_representation'
require 'google/apis/core/hashable'
require 'google/apis/errors'
module Google
  module Apis
    module PartnersV2
      
      # An object representing a latitude/longitude pair. This is expressed as a pair
      # of doubles representing degrees latitude and degrees longitude. Unless
      # specified otherwise, this must conform to the
      # WGS84
      # standard. Values must be within normalized ranges.
      # Example of normalization code in Python:
      # def NormalizeLongitude(longitude):
      # """Wraps decimal degrees longitude to [-180.0, 180.0]."""
      # q, r = divmod(longitude, 360.0)
      # if r > 180.0 or (r == 180.0 and q <= -1.0):
      # return r - 360.0
      # return r
      # def NormalizeLatLng(latitude, longitude):
      # """Wraps decimal degrees latitude and longitude to
      # [-90.0, 90.0] and [-180.0, 180.0], respectively."""
      # r = latitude % 360.0
      # if r <= 90.0:
      # return r, NormalizeLongitude(longitude)
      # elif r >= 270.0:
      # return r - 360, NormalizeLongitude(longitude)
      # else:
      # return 180 - r, NormalizeLongitude(longitude + 180.0)
      # assert 180.0 == NormalizeLongitude(180.0)
      # assert -180.0 == NormalizeLongitude(-180.0)
      # assert -179.0 == NormalizeLongitude(181.0)
      # assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
      # assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
      # assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
      # assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
      # assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
      # assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
      # assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
      # assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
      # assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
      # assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
      # The code in logs/storage/validator/logs_validator_traits.cc treats this type
      # as if it were annotated as ST_LOCATION.
      class LatLng
        include Google::Apis::Core::Hashable
      
        # The latitude in degrees. It must be in the range [-90.0, +90.0].
        # Corresponds to the JSON property `latitude`
        # @return [Float]
        attr_accessor :latitude
      
        # The longitude in degrees. It must be in the range [-180.0, +180.0].
        # Corresponds to the JSON property `longitude`
        # @return [Float]
        attr_accessor :longitude
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @latitude = args[:latitude] if args.key?(:latitude)
          @longitude = args[:longitude] if args.key?(:longitude)
        end
      end
      
      # Represents an amount of money with its currency type.
      class Money
        include Google::Apis::Core::Hashable
      
        # The whole units of the amount.
        # For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
        # Corresponds to the JSON property `units`
        # @return [Fixnum]
        attr_accessor :units
      
        # The 3-letter currency code defined in ISO 4217.
        # Corresponds to the JSON property `currencyCode`
        # @return [String]
        attr_accessor :currency_code
      
        # Number of nano (10^-9) units of the amount.
        # The value must be between -999,999,999 and +999,999,999 inclusive.
        # If `units` is positive, `nanos` must be positive or zero.
        # If `units` is zero, `nanos` can be positive, zero, or negative.
        # If `units` is negative, `nanos` must be negative or zero.
        # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
        # Corresponds to the JSON property `nanos`
        # @return [Fixnum]
        attr_accessor :nanos
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @units = args[:units] if args.key?(:units)
          @currency_code = args[:currency_code] if args.key?(:currency_code)
          @nanos = args[:nanos] if args.key?(:nanos)
        end
      end
      
      # Analytics aggregated data for a `Company` for a given date range.
      class AnalyticsSummary
        include Google::Apis::Core::Hashable
      
        # Aggregated number of times users saw the `Company`
        # in Google Partners Search results for given date range.
        # Corresponds to the JSON property `searchViewsCount`
        # @return [Fixnum]
        attr_accessor :search_views_count
      
        # Aggregated number of times users contacted the `Company`
        # for given date range.
        # Corresponds to the JSON property `contactsCount`
        # @return [Fixnum]
        attr_accessor :contacts_count
      
        # Aggregated number of profile views for the `Company` for given date range.
        # Corresponds to the JSON property `profileViewsCount`
        # @return [Fixnum]
        attr_accessor :profile_views_count
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @search_views_count = args[:search_views_count] if args.key?(:search_views_count)
          @contacts_count = args[:contacts_count] if args.key?(:contacts_count)
          @profile_views_count = args[:profile_views_count] if args.key?(:profile_views_count)
        end
      end
      
      # Request message for
      # LogClientMessage.
      class LogMessageRequest
        include Google::Apis::Core::Hashable
      
        # Message level of client message.
        # Corresponds to the JSON property `level`
        # @return [String]
        attr_accessor :level
      
        # Details about the client message.
        # Corresponds to the JSON property `details`
        # @return [String]
        attr_accessor :details
      
        # Map of client info, such as URL, browser navigator, browser platform, etc.
        # Corresponds to the JSON property `clientInfo`
        # @return [Hash]
        attr_accessor :client_info
      
        # Common data that is in each API request.
        # Corresponds to the JSON property `requestMetadata`
        # @return [Google::Apis::PartnersV2::RequestMetadata]
        attr_accessor :request_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @level = args[:level] if args.key?(:level)
          @details = args[:details] if args.key?(:details)
          @client_info = args[:client_info] if args.key?(:client_info)
          @request_metadata = args[:request_metadata] if args.key?(:request_metadata)
        end
      end
      
      # Debug information about this request.
      class DebugInfo
        include Google::Apis::Core::Hashable
      
        # Info about the server that serviced this request.
        # Corresponds to the JSON property `serverInfo`
        # @return [String]
        attr_accessor :server_info
      
        # Server-side debug stack trace.
        # Corresponds to the JSON property `serverTraceInfo`
        # @return [String]
        attr_accessor :server_trace_info
      
        # URL of the service that handled this request.
        # Corresponds to the JSON property `serviceUrl`
        # @return [String]
        attr_accessor :service_url
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @server_info = args[:server_info] if args.key?(:server_info)
          @server_trace_info = args[:server_trace_info] if args.key?(:server_trace_info)
          @service_url = args[:service_url] if args.key?(:service_url)
        end
      end
      
      # A lead resource that represents an advertiser contact for a `Company`. These
      # are usually generated via Google Partner Search (the advertiser portal).
      class Lead
        include Google::Apis::Core::Hashable
      
        # Whether or not the lead signed up for marketing emails
        # Corresponds to the JSON property `marketingOptIn`
        # @return [Boolean]
        attr_accessor :marketing_opt_in
        alias_method :marketing_opt_in?, :marketing_opt_in
      
        # Type of lead.
        # Corresponds to the JSON property `type`
        # @return [String]
        attr_accessor :type
      
        # Represents an amount of money with its currency type.
        # Corresponds to the JSON property `minMonthlyBudget`
        # @return [Google::Apis::PartnersV2::Money]
        attr_accessor :min_monthly_budget
      
        # First name of lead source.
        # Corresponds to the JSON property `givenName`
        # @return [String]
        attr_accessor :given_name
      
        # Language code of the lead's language preference, as defined by
        # BCP 47
        # (IETF BCP 47, "Tags for Identifying Languages").
        # Corresponds to the JSON property `languageCode`
        # @return [String]
        attr_accessor :language_code
      
        # Website URL of lead source.
        # Corresponds to the JSON property `websiteUrl`
        # @return [String]
        attr_accessor :website_url
      
        # List of reasons for using Google Partner Search and creating a lead.
        # Corresponds to the JSON property `gpsMotivations`
        # @return [Array]
        attr_accessor :gps_motivations
      
        # The lead's state in relation to the company.
        # Corresponds to the JSON property `state`
        # @return [String]
        attr_accessor :state
      
        # Email address of lead source.
        # Corresponds to the JSON property `email`
        # @return [String]
        attr_accessor :email
      
        # Last name of lead source.
        # Corresponds to the JSON property `familyName`
        # @return [String]
        attr_accessor :family_name
      
        # ID of the lead.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # Comments lead source gave.
        # Corresponds to the JSON property `comments`
        # @return [String]
        attr_accessor :comments
      
        # The AdWords Customer ID of the lead.
        # Corresponds to the JSON property `adwordsCustomerId`
        # @return [Fixnum]
        attr_accessor :adwords_customer_id
      
        # Phone number of lead source.
        # Corresponds to the JSON property `phoneNumber`
        # @return [String]
        attr_accessor :phone_number
      
        # Timestamp of when this lead was created.
        # Corresponds to the JSON property `createTime`
        # @return [String]
        attr_accessor :create_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @marketing_opt_in = args[:marketing_opt_in] if args.key?(:marketing_opt_in)
          @type = args[:type] if args.key?(:type)
          @min_monthly_budget = args[:min_monthly_budget] if args.key?(:min_monthly_budget)
          @given_name = args[:given_name] if args.key?(:given_name)
          @language_code = args[:language_code] if args.key?(:language_code)
          @website_url = args[:website_url] if args.key?(:website_url)
          @gps_motivations = args[:gps_motivations] if args.key?(:gps_motivations)
          @state = args[:state] if args.key?(:state)
          @email = args[:email] if args.key?(:email)
          @family_name = args[:family_name] if args.key?(:family_name)
          @id = args[:id] if args.key?(:id)
          @comments = args[:comments] if args.key?(:comments)
          @adwords_customer_id = args[:adwords_customer_id] if args.key?(:adwords_customer_id)
          @phone_number = args[:phone_number] if args.key?(:phone_number)
          @create_time = args[:create_time] if args.key?(:create_time)
        end
      end
      
      # Response message for
      # ListUserStates.
      class ListUserStatesResponse
        include Google::Apis::Core::Hashable
      
        # User's states.
        # Corresponds to the JSON property `userStates`
        # @return [Array]
        attr_accessor :user_states
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @user_states = args[:user_states] if args.key?(:user_states)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
        end
      end
      
      # A CompanyRelation resource representing information about a user's
      # affiliation and standing with a company in Partners.
      class CompanyRelation
        include Google::Apis::Core::Hashable
      
        # The timestamp when the user was approved.
        # @OutputOnly
        # Corresponds to the JSON property `resolvedTimestamp`
        # @return [String]
        attr_accessor :resolved_timestamp
      
        # Indicates if the user is an admin for this company.
        # Corresponds to the JSON property `companyAdmin`
        # @return [Boolean]
        attr_accessor :company_admin
        alias_method :company_admin?, :company_admin
      
        # The primary address for this company.
        # Corresponds to the JSON property `address`
        # @return [String]
        attr_accessor :address
      
        # The flag that indicates if the company is pending verification.
        # Corresponds to the JSON property `isPending`
        # @return [Boolean]
        attr_accessor :is_pending
        alias_method :is_pending?, :is_pending
      
        # The timestamp of when affiliation was requested.
        # @OutputOnly
        # Corresponds to the JSON property `creationTime`
        # @return [String]
        attr_accessor :creation_time
      
        # The state of relationship, in terms of approvals.
        # Corresponds to the JSON property `state`
        # @return [String]
        attr_accessor :state
      
        # The name (in the company's primary language) for the company.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # The AdWords manager account # associated this company.
        # Corresponds to the JSON property `managerAccount`
        # @return [Fixnum]
        attr_accessor :manager_account
      
        # The segment the company is classified as.
        # Corresponds to the JSON property `segment`
        # @return [Array]
        attr_accessor :segment
      
        # Whether the company is a Partner.
        # Corresponds to the JSON property `badgeTier`
        # @return [String]
        attr_accessor :badge_tier
      
        # The list of Google Partners specialization statuses for the company.
        # Corresponds to the JSON property `specializationStatus`
        # @return [Array]
        attr_accessor :specialization_status
      
        # The phone number for the company's primary address.
        # Corresponds to the JSON property `phoneNumber`
        # @return [String]
        attr_accessor :phone_number
      
        # The website URL for this company.
        # Corresponds to the JSON property `website`
        # @return [String]
        attr_accessor :website
      
        # The ID of the company. There may be no id if this is a
        # pending company.5
        # Corresponds to the JSON property `companyId`
        # @return [String]
        attr_accessor :company_id
      
        # A URL to a profile photo, e.g. a G+ profile photo.
        # Corresponds to the JSON property `logoUrl`
        # @return [String]
        attr_accessor :logo_url
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @resolved_timestamp = args[:resolved_timestamp] if args.key?(:resolved_timestamp)
          @company_admin = args[:company_admin] if args.key?(:company_admin)
          @address = args[:address] if args.key?(:address)
          @is_pending = args[:is_pending] if args.key?(:is_pending)
          @creation_time = args[:creation_time] if args.key?(:creation_time)
          @state = args[:state] if args.key?(:state)
          @name = args[:name] if args.key?(:name)
          @manager_account = args[:manager_account] if args.key?(:manager_account)
          @segment = args[:segment] if args.key?(:segment)
          @badge_tier = args[:badge_tier] if args.key?(:badge_tier)
          @specialization_status = args[:specialization_status] if args.key?(:specialization_status)
          @phone_number = args[:phone_number] if args.key?(:phone_number)
          @website = args[:website] if args.key?(:website)
          @company_id = args[:company_id] if args.key?(:company_id)
          @logo_url = args[:logo_url] if args.key?(:logo_url)
        end
      end
      
      # Represents a whole calendar date, e.g. date of birth. The time of day and
      # time zone are either specified elsewhere or are not significant. The date
      # is relative to the Proleptic Gregorian Calendar. The day may be 0 to
      # represent a year and month where the day is not significant, e.g. credit card
      # expiration date. The year may be 0 to represent a month and day independent
      # of year, e.g. anniversary date. Related types are google.type.TimeOfDay
      # and `google.protobuf.Timestamp`.
      class Date
        include Google::Apis::Core::Hashable
      
        # Year of date. Must be from 1 to 9999, or 0 if specifying a date without
        # a year.
        # Corresponds to the JSON property `year`
        # @return [Fixnum]
        attr_accessor :year
      
        # Day of month. Must be from 1 to 31 and valid for the year and month, or 0
        # if specifying a year/month where the day is not significant.
        # Corresponds to the JSON property `day`
        # @return [Fixnum]
        attr_accessor :day
      
        # Month of year. Must be from 1 to 12.
        # Corresponds to the JSON property `month`
        # @return [Fixnum]
        attr_accessor :month
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @year = args[:year] if args.key?(:year)
          @day = args[:day] if args.key?(:day)
          @month = args[:month] if args.key?(:month)
        end
      end
      
      # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      # service Foo `
      # rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      # `
      # The JSON representation for `Empty` is empty JSON object ````.
      class Empty
        include Google::Apis::Core::Hashable
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
        end
      end
      
      # Source of traffic for the current request.
      class TrafficSource
        include Google::Apis::Core::Hashable
      
        # Identifier to indicate where the traffic comes from.
        # An identifier has multiple letters created by a team which redirected the
        # traffic to us.
        # Corresponds to the JSON property `trafficSourceId`
        # @return [String]
        attr_accessor :traffic_source_id
      
        # Second level identifier to indicate where the traffic comes from.
        # An identifier has multiple letters created by a team which redirected the
        # traffic to us.
        # Corresponds to the JSON property `trafficSubId`
        # @return [String]
        attr_accessor :traffic_sub_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @traffic_source_id = args[:traffic_source_id] if args.key?(:traffic_source_id)
          @traffic_sub_id = args[:traffic_sub_id] if args.key?(:traffic_sub_id)
        end
      end
      
      # Common data that is in each API request.
      class RequestMetadata
        include Google::Apis::Core::Hashable
      
        # Experiment IDs the current request belongs to.
        # Corresponds to the JSON property `experimentIds`
        # @return [Array]
        attr_accessor :experiment_ids
      
        # Source of traffic for the current request.
        # Corresponds to the JSON property `trafficSource`
        # @return [Google::Apis::PartnersV2::TrafficSource]
        attr_accessor :traffic_source
      
        # Locale to use for the current request.
        # Corresponds to the JSON property `locale`
        # @return [String]
        attr_accessor :locale
      
        # Values to use instead of the user's respective defaults. These are only
        # honored by whitelisted products.
        # Corresponds to the JSON property `userOverrides`
        # @return [Google::Apis::PartnersV2::UserOverrides]
        attr_accessor :user_overrides
      
        # Google Partners session ID.
        # Corresponds to the JSON property `partnersSessionId`
        # @return [String]
        attr_accessor :partners_session_id
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @experiment_ids = args[:experiment_ids] if args.key?(:experiment_ids)
          @traffic_source = args[:traffic_source] if args.key?(:traffic_source)
          @locale = args[:locale] if args.key?(:locale)
          @user_overrides = args[:user_overrides] if args.key?(:user_overrides)
          @partners_session_id = args[:partners_session_id] if args.key?(:partners_session_id)
        end
      end
      
      # Request message for CreateLead.
      class CreateLeadRequest
        include Google::Apis::Core::Hashable
      
        # Common data that is in each API request.
        # Corresponds to the JSON property `requestMetadata`
        # @return [Google::Apis::PartnersV2::RequestMetadata]
        attr_accessor :request_metadata
      
        # A lead resource that represents an advertiser contact for a `Company`. These
        # are usually generated via Google Partner Search (the advertiser portal).
        # Corresponds to the JSON property `lead`
        # @return [Google::Apis::PartnersV2::Lead]
        attr_accessor :lead
      
        # reCaptcha challenge info.
        # Corresponds to the JSON property `recaptchaChallenge`
        # @return [Google::Apis::PartnersV2::RecaptchaChallenge]
        attr_accessor :recaptcha_challenge
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @request_metadata = args[:request_metadata] if args.key?(:request_metadata)
          @lead = args[:lead] if args.key?(:lead)
          @recaptcha_challenge = args[:recaptcha_challenge] if args.key?(:recaptcha_challenge)
        end
      end
      
      # Key value data pair for an event.
      class EventData
        include Google::Apis::Core::Hashable
      
        # Data type.
        # Corresponds to the JSON property `key`
        # @return [String]
        attr_accessor :key
      
        # Data values.
        # Corresponds to the JSON property `values`
        # @return [Array]
        attr_accessor :values
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @key = args[:key] if args.key?(:key)
          @values = args[:values] if args.key?(:values)
        end
      end
      
      # A user's information on a specific exam.
      class ExamStatus
        include Google::Apis::Core::Hashable
      
        # The date the user last taken this exam.
        # Corresponds to the JSON property `taken`
        # @return [String]
        attr_accessor :taken
      
        # Whether this exam has been passed and not expired.
        # Corresponds to the JSON property `passed`
        # @return [Boolean]
        attr_accessor :passed
        alias_method :passed?, :passed
      
        # Date this exam is due to expire.
        # Corresponds to the JSON property `expiration`
        # @return [String]
        attr_accessor :expiration
      
        # Whether this exam is in the state of warning.
        # Corresponds to the JSON property `warning`
        # @return [Boolean]
        attr_accessor :warning
        alias_method :warning?, :warning
      
        # The date the user last passed this exam.
        # Corresponds to the JSON property `lastPassed`
        # @return [String]
        attr_accessor :last_passed
      
        # The type of the exam.
        # Corresponds to the JSON property `examType`
        # @return [String]
        attr_accessor :exam_type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @taken = args[:taken] if args.key?(:taken)
          @passed = args[:passed] if args.key?(:passed)
          @expiration = args[:expiration] if args.key?(:expiration)
          @warning = args[:warning] if args.key?(:warning)
          @last_passed = args[:last_passed] if args.key?(:last_passed)
          @exam_type = args[:exam_type] if args.key?(:exam_type)
        end
      end
      
      # Response for ListOffer.
      class ListOffersResponse
        include Google::Apis::Core::Hashable
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        # Reason why no Offers are available.
        # Corresponds to the JSON property `noOfferReason`
        # @return [String]
        attr_accessor :no_offer_reason
      
        # Available Offers to be distributed.
        # Corresponds to the JSON property `availableOffers`
        # @return [Array]
        attr_accessor :available_offers
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
          @no_offer_reason = args[:no_offer_reason] if args.key?(:no_offer_reason)
          @available_offers = args[:available_offers] if args.key?(:available_offers)
        end
      end
      
      # Offer info by country.
      class CountryOfferInfo
        include Google::Apis::Core::Hashable
      
        # Country code for which offer codes may be requested.
        # Corresponds to the JSON property `offerCountryCode`
        # @return [String]
        attr_accessor :offer_country_code
      
        # (localized) Spend X amount for that country's offer.
        # Corresponds to the JSON property `spendXAmount`
        # @return [String]
        attr_accessor :spend_x_amount
      
        # Type of offer country is eligible for.
        # Corresponds to the JSON property `offerType`
        # @return [String]
        attr_accessor :offer_type
      
        # (localized) Get Y amount for that country's offer.
        # Corresponds to the JSON property `getYAmount`
        # @return [String]
        attr_accessor :get_y_amount
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @offer_country_code = args[:offer_country_code] if args.key?(:offer_country_code)
          @spend_x_amount = args[:spend_x_amount] if args.key?(:spend_x_amount)
          @offer_type = args[:offer_type] if args.key?(:offer_type)
          @get_y_amount = args[:get_y_amount] if args.key?(:get_y_amount)
        end
      end
      
      # Response message for
      # ListCompanies.
      class ListCompaniesResponse
        include Google::Apis::Core::Hashable
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        # The list of companies.
        # Corresponds to the JSON property `companies`
        # @return [Array]
        attr_accessor :companies
      
        # A token to retrieve next page of results.
        # Pass this value in the `ListCompaniesRequest.page_token` field in the
        # subsequent call to
        # ListCompanies to retrieve the
        # next page of results.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
          @companies = args[:companies] if args.key?(:companies)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # Customers qualified for an offer.
      class OfferCustomer
        include Google::Apis::Core::Hashable
      
        # Formatted Get Y amount with currency code.
        # Corresponds to the JSON property `getYAmount`
        # @return [String]
        attr_accessor :get_y_amount
      
        # Name of the customer.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # Formatted Spend X amount with currency code.
        # Corresponds to the JSON property `spendXAmount`
        # @return [String]
        attr_accessor :spend_x_amount
      
        # URL to the customer's AdWords page.
        # Corresponds to the JSON property `adwordsUrl`
        # @return [String]
        attr_accessor :adwords_url
      
        # Type of the offer
        # Corresponds to the JSON property `offerType`
        # @return [String]
        attr_accessor :offer_type
      
        # Country code of the customer.
        # Corresponds to the JSON property `countryCode`
        # @return [String]
        attr_accessor :country_code
      
        # External CID for the customer.
        # Corresponds to the JSON property `externalCid`
        # @return [Fixnum]
        attr_accessor :external_cid
      
        # Days the customer is still eligible.
        # Corresponds to the JSON property `eligibilityDaysLeft`
        # @return [Fixnum]
        attr_accessor :eligibility_days_left
      
        # Time the customer was created.
        # Corresponds to the JSON property `creationTime`
        # @return [String]
        attr_accessor :creation_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @get_y_amount = args[:get_y_amount] if args.key?(:get_y_amount)
          @name = args[:name] if args.key?(:name)
          @spend_x_amount = args[:spend_x_amount] if args.key?(:spend_x_amount)
          @adwords_url = args[:adwords_url] if args.key?(:adwords_url)
          @offer_type = args[:offer_type] if args.key?(:offer_type)
          @country_code = args[:country_code] if args.key?(:country_code)
          @external_cid = args[:external_cid] if args.key?(:external_cid)
          @eligibility_days_left = args[:eligibility_days_left] if args.key?(:eligibility_days_left)
          @creation_time = args[:creation_time] if args.key?(:creation_time)
        end
      end
      
      # Google Partners certification status.
      class CertificationStatus
        include Google::Apis::Core::Hashable
      
        # List of certification exam statuses.
        # Corresponds to the JSON property `examStatuses`
        # @return [Array]
        attr_accessor :exam_statuses
      
        # The type of the certification.
        # Corresponds to the JSON property `type`
        # @return [String]
        attr_accessor :type
      
        # Number of people who are certified,
        # Corresponds to the JSON property `userCount`
        # @return [Fixnum]
        attr_accessor :user_count
      
        # Whether certification is passing.
        # Corresponds to the JSON property `isCertified`
        # @return [Boolean]
        attr_accessor :is_certified
        alias_method :is_certified?, :is_certified
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @exam_statuses = args[:exam_statuses] if args.key?(:exam_statuses)
          @type = args[:type] if args.key?(:type)
          @user_count = args[:user_count] if args.key?(:user_count)
          @is_certified = args[:is_certified] if args.key?(:is_certified)
        end
      end
      
      # The localized company information.
      class LocalizedCompanyInfo
        include Google::Apis::Core::Hashable
      
        # List of country codes for the localized company info.
        # Corresponds to the JSON property `countryCodes`
        # @return [Array]
        attr_accessor :country_codes
      
        # Localized brief description that the company uses to advertise themselves.
        # Corresponds to the JSON property `overview`
        # @return [String]
        attr_accessor :overview
      
        # Localized display name.
        # Corresponds to the JSON property `displayName`
        # @return [String]
        attr_accessor :display_name
      
        # Language code of the localized company info, as defined by
        # BCP 47
        # (IETF BCP 47, "Tags for Identifying Languages").
        # Corresponds to the JSON property `languageCode`
        # @return [String]
        attr_accessor :language_code
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @country_codes = args[:country_codes] if args.key?(:country_codes)
          @overview = args[:overview] if args.key?(:overview)
          @display_name = args[:display_name] if args.key?(:display_name)
          @language_code = args[:language_code] if args.key?(:language_code)
        end
      end
      
      # Response message for
      # LogUserEvent.
      class LogUserEventResponse
        include Google::Apis::Core::Hashable
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
        end
      end
      
      # Response for ListOfferHistory.
      class ListOffersHistoryResponse
        include Google::Apis::Core::Hashable
      
        # True if the user has the option to show entire company history.
        # Corresponds to the JSON property `canShowEntireCompany`
        # @return [Boolean]
        attr_accessor :can_show_entire_company
        alias_method :can_show_entire_company?, :can_show_entire_company
      
        # Number of results across all pages.
        # Corresponds to the JSON property `totalResults`
        # @return [Fixnum]
        attr_accessor :total_results
      
        # True if this response is showing entire company history.
        # Corresponds to the JSON property `showingEntireCompany`
        # @return [Boolean]
        attr_accessor :showing_entire_company
        alias_method :showing_entire_company?, :showing_entire_company
      
        # Historical offers meeting request.
        # Corresponds to the JSON property `offers`
        # @return [Array]
        attr_accessor :offers
      
        # Supply this token in a ListOffersHistoryRequest to retrieve the next page.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @can_show_entire_company = args[:can_show_entire_company] if args.key?(:can_show_entire_company)
          @total_results = args[:total_results] if args.key?(:total_results)
          @showing_entire_company = args[:showing_entire_company] if args.key?(:showing_entire_company)
          @offers = args[:offers] if args.key?(:offers)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
        end
      end
      
      # Response message for
      # LogClientMessage.
      class LogMessageResponse
        include Google::Apis::Core::Hashable
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
        end
      end
      
      # Agency specialization status
      class SpecializationStatus
        include Google::Apis::Core::Hashable
      
        # The specialization this status is for.
        # Corresponds to the JSON property `badgeSpecialization`
        # @return [String]
        attr_accessor :badge_specialization
      
        # State of agency specialization.
        # Corresponds to the JSON property `badgeSpecializationState`
        # @return [String]
        attr_accessor :badge_specialization_state
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @badge_specialization = args[:badge_specialization] if args.key?(:badge_specialization)
          @badge_specialization_state = args[:badge_specialization_state] if args.key?(:badge_specialization_state)
        end
      end
      
      # A user's information on a specific certification.
      class Certification
        include Google::Apis::Core::Hashable
      
        # The date the user last achieved certification.
        # Corresponds to the JSON property `lastAchieved`
        # @return [String]
        attr_accessor :last_achieved
      
        # Whether this certification has been achieved.
        # Corresponds to the JSON property `achieved`
        # @return [Boolean]
        attr_accessor :achieved
        alias_method :achieved?, :achieved
      
        # Date this certification is due to expire.
        # Corresponds to the JSON property `expiration`
        # @return [String]
        attr_accessor :expiration
      
        # Whether this certification is in the state of warning.
        # Corresponds to the JSON property `warning`
        # @return [Boolean]
        attr_accessor :warning
        alias_method :warning?, :warning
      
        # The type of certification, the area of expertise.
        # Corresponds to the JSON property `certificationType`
        # @return [String]
        attr_accessor :certification_type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @last_achieved = args[:last_achieved] if args.key?(:last_achieved)
          @achieved = args[:achieved] if args.key?(:achieved)
          @expiration = args[:expiration] if args.key?(:expiration)
          @warning = args[:warning] if args.key?(:warning)
          @certification_type = args[:certification_type] if args.key?(:certification_type)
        end
      end
      
      # A resource representing a user of the Partners platform.
      class User
        include Google::Apis::Core::Hashable
      
        # This is the list of AdWords Manager Accounts the user has edit access to.
        # If the user has edit access to multiple accounts, the user can choose the
        # preferred account and we use this when a personal account is needed. Can
        # be empty meaning the user has access to no accounts.
        # @OutputOnly
        # Corresponds to the JSON property `availableAdwordsManagerAccounts`
        # @return [Array]
        attr_accessor :available_adwords_manager_accounts
      
        # The list of emails the user has access to/can select as primary.
        # @OutputOnly
        # Corresponds to the JSON property `primaryEmails`
        # @return [Array]
        attr_accessor :primary_emails
      
        # The list of exams the user ever taken. For each type of exam, only one
        # entry is listed.
        # Corresponds to the JSON property `examStatus`
        # @return [Array]
        attr_accessor :exam_status
      
        # The ID of the user.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # Basic information from a public profile.
        # Corresponds to the JSON property `publicProfile`
        # @return [Google::Apis::PartnersV2::PublicProfile]
        attr_accessor :public_profile
      
        # The email address used by the user used for company verification.
        # @OutputOnly
        # Corresponds to the JSON property `companyVerificationEmail`
        # @return [String]
        attr_accessor :company_verification_email
      
        # The list of achieved certifications. These are calculated based on exam
        # results and other requirements.
        # @OutputOnly
        # Corresponds to the JSON property `certificationStatus`
        # @return [Array]
        attr_accessor :certification_status
      
        # A CompanyRelation resource representing information about a user's
        # affiliation and standing with a company in Partners.
        # Corresponds to the JSON property `company`
        # @return [Google::Apis::PartnersV2::CompanyRelation]
        attr_accessor :company
      
        # The profile information of a Partners user.
        # Corresponds to the JSON property `profile`
        # @return [Google::Apis::PartnersV2::UserProfile]
        attr_accessor :profile
      
        # The most recent time the user interacted with the Partners site.
        # @OutputOnly
        # Corresponds to the JSON property `lastAccessTime`
        # @return [String]
        attr_accessor :last_access_time
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @available_adwords_manager_accounts = args[:available_adwords_manager_accounts] if args.key?(:available_adwords_manager_accounts)
          @primary_emails = args[:primary_emails] if args.key?(:primary_emails)
          @exam_status = args[:exam_status] if args.key?(:exam_status)
          @id = args[:id] if args.key?(:id)
          @public_profile = args[:public_profile] if args.key?(:public_profile)
          @company_verification_email = args[:company_verification_email] if args.key?(:company_verification_email)
          @certification_status = args[:certification_status] if args.key?(:certification_status)
          @company = args[:company] if args.key?(:company)
          @profile = args[:profile] if args.key?(:profile)
          @last_access_time = args[:last_access_time] if args.key?(:last_access_time)
        end
      end
      
      # Response message for
      # ListAnalytics.
      class ListAnalyticsResponse
        include Google::Apis::Core::Hashable
      
        # A token to retrieve next page of results.
        # Pass this value in the `ListAnalyticsRequest.page_token` field in the
        # subsequent call to
        # ListAnalytics to retrieve the
        # next page of results.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        # Analytics aggregated data for a `Company` for a given date range.
        # Corresponds to the JSON property `analyticsSummary`
        # @return [Google::Apis::PartnersV2::AnalyticsSummary]
        attr_accessor :analytics_summary
      
        # The list of analytics.
        # Sorted in ascending order of
        # Analytics.event_date.
        # Corresponds to the JSON property `analytics`
        # @return [Array]
        attr_accessor :analytics
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
          @analytics_summary = args[:analytics_summary] if args.key?(:analytics_summary)
          @analytics = args[:analytics] if args.key?(:analytics)
        end
      end
      
      # Response message for ListLeads.
      class ListLeadsResponse
        include Google::Apis::Core::Hashable
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        # The total count of leads for the given company.
        # Corresponds to the JSON property `totalSize`
        # @return [Fixnum]
        attr_accessor :total_size
      
        # The list of leads.
        # Corresponds to the JSON property `leads`
        # @return [Array]
        attr_accessor :leads
      
        # A token to retrieve next page of results.
        # Pass this value in the `ListLeadsRequest.page_token` field in the
        # subsequent call to
        # ListLeads to retrieve the
        # next page of results.
        # Corresponds to the JSON property `nextPageToken`
        # @return [String]
        attr_accessor :next_page_token
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
          @total_size = args[:total_size] if args.key?(:total_size)
          @leads = args[:leads] if args.key?(:leads)
          @next_page_token = args[:next_page_token] if args.key?(:next_page_token)
        end
      end
      
      # A company resource in the Google Partners API. Once certified, it qualifies
      # for being searched by advertisers.
      class Company
        include Google::Apis::Core::Hashable
      
        # The list of all company locations.
        # If set, must include the
        # primary_location
        # in the list.
        # Corresponds to the JSON property `locations`
        # @return [Array]
        attr_accessor :locations
      
        # Represents an amount of money with its currency type.
        # Corresponds to the JSON property `convertedMinMonthlyBudget`
        # @return [Google::Apis::PartnersV2::Money]
        attr_accessor :converted_min_monthly_budget
      
        # Industries the company can help with.
        # Corresponds to the JSON property `industries`
        # @return [Array]
        attr_accessor :industries
      
        # URL of the company's website.
        # Corresponds to the JSON property `websiteUrl`
        # @return [String]
        attr_accessor :website_url
      
        # URL of the company's additional websites used to verify the dynamic badges.
        # These are stored as full URLs as entered by the user, but only the TLD will
        # be used for the actual verification.
        # Corresponds to the JSON property `additionalWebsites`
        # @return [Array]
        attr_accessor :additional_websites
      
        # The Primary AdWords Manager Account id.
        # Corresponds to the JSON property `primaryAdwordsManagerAccountId`
        # @return [Fixnum]
        attr_accessor :primary_adwords_manager_account_id
      
        # The name of the company.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # The list of localized info for the company.
        # Corresponds to the JSON property `localizedInfos`
        # @return [Array]
        attr_accessor :localized_infos
      
        # The ID of the company.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # The list of Google Partners certification statuses for the company.
        # Corresponds to the JSON property `certificationStatuses`
        # @return [Array]
        attr_accessor :certification_statuses
      
        # Basic information from a public profile.
        # Corresponds to the JSON property `publicProfile`
        # @return [Google::Apis::PartnersV2::PublicProfile]
        attr_accessor :public_profile
      
        # A location with address and geographic coordinates. May optionally contain a
        # detailed (multi-field) version of the address.
        # Corresponds to the JSON property `primaryLocation`
        # @return [Google::Apis::PartnersV2::Location]
        attr_accessor :primary_location
      
        # Services the company can help with.
        # Corresponds to the JSON property `services`
        # @return [Array]
        attr_accessor :services
      
        # Represents an amount of money with its currency type.
        # Corresponds to the JSON property `originalMinMonthlyBudget`
        # @return [Google::Apis::PartnersV2::Money]
        attr_accessor :original_min_monthly_budget
      
        # Information related to the ranking of the company within the list of
        # companies.
        # Corresponds to the JSON property `ranks`
        # @return [Array]
        attr_accessor :ranks
      
        # Partner badge tier
        # Corresponds to the JSON property `badgeTier`
        # @return [String]
        attr_accessor :badge_tier
      
        # The list of Google Partners specialization statuses for the company.
        # Corresponds to the JSON property `specializationStatus`
        # @return [Array]
        attr_accessor :specialization_status
      
        # Company type labels listed on the company's profile.
        # Corresponds to the JSON property `companyTypes`
        # @return [Array]
        attr_accessor :company_types
      
        # Email domains that allow users with a matching email address to get
        # auto-approved for associating with this company.
        # Corresponds to the JSON property `autoApprovalEmailDomains`
        # @return [Array]
        attr_accessor :auto_approval_email_domains
      
        # The primary language code of the company, as defined by
        # BCP 47
        # (IETF BCP 47, "Tags for Identifying Languages").
        # Corresponds to the JSON property `primaryLanguageCode`
        # @return [String]
        attr_accessor :primary_language_code
      
        # The public viewability status of the company's profile.
        # Corresponds to the JSON property `profileStatus`
        # @return [String]
        attr_accessor :profile_status
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @locations = args[:locations] if args.key?(:locations)
          @converted_min_monthly_budget = args[:converted_min_monthly_budget] if args.key?(:converted_min_monthly_budget)
          @industries = args[:industries] if args.key?(:industries)
          @website_url = args[:website_url] if args.key?(:website_url)
          @additional_websites = args[:additional_websites] if args.key?(:additional_websites)
          @primary_adwords_manager_account_id = args[:primary_adwords_manager_account_id] if args.key?(:primary_adwords_manager_account_id)
          @name = args[:name] if args.key?(:name)
          @localized_infos = args[:localized_infos] if args.key?(:localized_infos)
          @id = args[:id] if args.key?(:id)
          @certification_statuses = args[:certification_statuses] if args.key?(:certification_statuses)
          @public_profile = args[:public_profile] if args.key?(:public_profile)
          @primary_location = args[:primary_location] if args.key?(:primary_location)
          @services = args[:services] if args.key?(:services)
          @original_min_monthly_budget = args[:original_min_monthly_budget] if args.key?(:original_min_monthly_budget)
          @ranks = args[:ranks] if args.key?(:ranks)
          @badge_tier = args[:badge_tier] if args.key?(:badge_tier)
          @specialization_status = args[:specialization_status] if args.key?(:specialization_status)
          @company_types = args[:company_types] if args.key?(:company_types)
          @auto_approval_email_domains = args[:auto_approval_email_domains] if args.key?(:auto_approval_email_domains)
          @primary_language_code = args[:primary_language_code] if args.key?(:primary_language_code)
          @profile_status = args[:profile_status] if args.key?(:profile_status)
        end
      end
      
      # Response message for CreateLead.
      class CreateLeadResponse
        include Google::Apis::Core::Hashable
      
        # A lead resource that represents an advertiser contact for a `Company`. These
        # are usually generated via Google Partner Search (the advertiser portal).
        # Corresponds to the JSON property `lead`
        # @return [Google::Apis::PartnersV2::Lead]
        attr_accessor :lead
      
        # The outcome of reCaptcha
        # validation.
        # Corresponds to the JSON property `recaptchaStatus`
        # @return [String]
        attr_accessor :recaptcha_status
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @lead = args[:lead] if args.key?(:lead)
          @recaptcha_status = args[:recaptcha_status] if args.key?(:recaptcha_status)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
        end
      end
      
      # Response message for GetCompany.
      class GetCompanyResponse
        include Google::Apis::Core::Hashable
      
        # A company resource in the Google Partners API. Once certified, it qualifies
        # for being searched by advertisers.
        # Corresponds to the JSON property `company`
        # @return [Google::Apis::PartnersV2::Company]
        attr_accessor :company
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @company = args[:company] if args.key?(:company)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
        end
      end
      
      # A location with address and geographic coordinates. May optionally contain a
      # detailed (multi-field) version of the address.
      class Location
        include Google::Apis::Core::Hashable
      
        # The following address lines represent the most specific part of any
        # address.
        # Corresponds to the JSON property `addressLine`
        # @return [Array]
        attr_accessor :address_line
      
        # Generally refers to the city/town portion of an address.
        # Corresponds to the JSON property `locality`
        # @return [String]
        attr_accessor :locality
      
        # Top-level administrative subdivision of this country.
        # Corresponds to the JSON property `administrativeArea`
        # @return [String]
        attr_accessor :administrative_area
      
        # An object representing a latitude/longitude pair. This is expressed as a pair
        # of doubles representing degrees latitude and degrees longitude. Unless
        # specified otherwise, this must conform to the
        # WGS84
        # standard. Values must be within normalized ranges.
        # Example of normalization code in Python:
        # def NormalizeLongitude(longitude):
        # """Wraps decimal degrees longitude to [-180.0, 180.0]."""
        # q, r = divmod(longitude, 360.0)
        # if r > 180.0 or (r == 180.0 and q <= -1.0):
        # return r - 360.0
        # return r
        # def NormalizeLatLng(latitude, longitude):
        # """Wraps decimal degrees latitude and longitude to
        # [-90.0, 90.0] and [-180.0, 180.0], respectively."""
        # r = latitude % 360.0
        # if r <= 90.0:
        # return r, NormalizeLongitude(longitude)
        # elif r >= 270.0:
        # return r - 360, NormalizeLongitude(longitude)
        # else:
        # return 180 - r, NormalizeLongitude(longitude + 180.0)
        # assert 180.0 == NormalizeLongitude(180.0)
        # assert -180.0 == NormalizeLongitude(-180.0)
        # assert -179.0 == NormalizeLongitude(181.0)
        # assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
        # assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
        # assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
        # assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
        # assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
        # assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
        # assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
        # assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
        # assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
        # assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
        # The code in logs/storage/validator/logs_validator_traits.cc treats this type
        # as if it were annotated as ST_LOCATION.
        # Corresponds to the JSON property `latLng`
        # @return [Google::Apis::PartnersV2::LatLng]
        attr_accessor :lat_lng
      
        # The single string version of the address.
        # Corresponds to the JSON property `address`
        # @return [String]
        attr_accessor :address
      
        # CLDR (Common Locale Data Repository) region code .
        # Corresponds to the JSON property `regionCode`
        # @return [String]
        attr_accessor :region_code
      
        # Dependent locality or sublocality. Used for UK dependent localities, or
        # neighborhoods or boroughs in other locations.
        # Corresponds to the JSON property `dependentLocality`
        # @return [String]
        attr_accessor :dependent_locality
      
        # Values are frequently alphanumeric.
        # Corresponds to the JSON property `postalCode`
        # @return [String]
        attr_accessor :postal_code
      
        # Use of this code is very country-specific, but will refer to a secondary
        # classification code for sorting mail.
        # Corresponds to the JSON property `sortingCode`
        # @return [String]
        attr_accessor :sorting_code
      
        # Language code of the address. Should be in BCP 47 format.
        # Corresponds to the JSON property `languageCode`
        # @return [String]
        attr_accessor :language_code
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @address_line = args[:address_line] if args.key?(:address_line)
          @locality = args[:locality] if args.key?(:locality)
          @administrative_area = args[:administrative_area] if args.key?(:administrative_area)
          @lat_lng = args[:lat_lng] if args.key?(:lat_lng)
          @address = args[:address] if args.key?(:address)
          @region_code = args[:region_code] if args.key?(:region_code)
          @dependent_locality = args[:dependent_locality] if args.key?(:dependent_locality)
          @postal_code = args[:postal_code] if args.key?(:postal_code)
          @sorting_code = args[:sorting_code] if args.key?(:sorting_code)
          @language_code = args[:language_code] if args.key?(:language_code)
        end
      end
      
      # Status for a Google Partners certification exam.
      class CertificationExamStatus
        include Google::Apis::Core::Hashable
      
        # The number of people who have passed the certification exam.
        # Corresponds to the JSON property `numberUsersPass`
        # @return [Fixnum]
        attr_accessor :number_users_pass
      
        # The type of certification exam.
        # Corresponds to the JSON property `type`
        # @return [String]
        attr_accessor :type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @number_users_pass = args[:number_users_pass] if args.key?(:number_users_pass)
          @type = args[:type] if args.key?(:type)
        end
      end
      
      # A token that allows a user to take an exam.
      class ExamToken
        include Google::Apis::Core::Hashable
      
        # The id of the exam the token is for.
        # Corresponds to the JSON property `examId`
        # @return [Fixnum]
        attr_accessor :exam_id
      
        # The token, only present if the user has access to the exam.
        # Corresponds to the JSON property `token`
        # @return [String]
        attr_accessor :token
      
        # The type of the exam the token belongs to.
        # Corresponds to the JSON property `examType`
        # @return [String]
        attr_accessor :exam_type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @exam_id = args[:exam_id] if args.key?(:exam_id)
          @token = args[:token] if args.key?(:token)
          @exam_type = args[:exam_type] if args.key?(:exam_type)
        end
      end
      
      # A set of opt-ins for a user.
      class OptIns
        include Google::Apis::Core::Hashable
      
        # An opt-in to receive special promotional gifts and material in the mail.
        # Corresponds to the JSON property `physicalMail`
        # @return [Boolean]
        attr_accessor :physical_mail
        alias_method :physical_mail?, :physical_mail
      
        # An opt-in to allow recieivng phone calls about their Partners account.
        # Corresponds to the JSON property `phoneContact`
        # @return [Boolean]
        attr_accessor :phone_contact
        alias_method :phone_contact?, :phone_contact
      
        # An opt-in about receiving email from Partners marketing teams. Includes
        # member-only events and special promotional offers for Google products.
        # Corresponds to the JSON property `marketComm`
        # @return [Boolean]
        attr_accessor :market_comm
        alias_method :market_comm?, :market_comm
      
        # An opt-in about receiving email regarding new features and products.
        # Corresponds to the JSON property `specialOffers`
        # @return [Boolean]
        attr_accessor :special_offers
        alias_method :special_offers?, :special_offers
      
        # An opt-in about receiving email with customized AdWords campaign management
        # tips.
        # Corresponds to the JSON property `performanceSuggestions`
        # @return [Boolean]
        attr_accessor :performance_suggestions
        alias_method :performance_suggestions?, :performance_suggestions
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @physical_mail = args[:physical_mail] if args.key?(:physical_mail)
          @phone_contact = args[:phone_contact] if args.key?(:phone_contact)
          @market_comm = args[:market_comm] if args.key?(:market_comm)
          @special_offers = args[:special_offers] if args.key?(:special_offers)
          @performance_suggestions = args[:performance_suggestions] if args.key?(:performance_suggestions)
        end
      end
      
      # Information related to ranking of results.
      class Rank
        include Google::Apis::Core::Hashable
      
        # The numerical value of the rank.
        # Corresponds to the JSON property `value`
        # @return [Float]
        attr_accessor :value
      
        # The type of rank.
        # Corresponds to the JSON property `type`
        # @return [String]
        attr_accessor :type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @value = args[:value] if args.key?(:value)
          @type = args[:type] if args.key?(:type)
        end
      end
      
      # The profile information of a Partners user.
      class UserProfile
        include Google::Apis::Core::Hashable
      
        # A location with address and geographic coordinates. May optionally contain a
        # detailed (multi-field) version of the address.
        # Corresponds to the JSON property `address`
        # @return [Google::Apis::PartnersV2::Location]
        attr_accessor :address
      
        # A list of ids representing which industries the user selected.
        # Corresponds to the JSON property `industries`
        # @return [Array]
        attr_accessor :industries
      
        # The list of languages this user understands.
        # Corresponds to the JSON property `languages`
        # @return [Array]
        attr_accessor :languages
      
        # The user's family name.
        # Corresponds to the JSON property `familyName`
        # @return [String]
        attr_accessor :family_name
      
        # A set of opt-ins for a user.
        # Corresponds to the JSON property `emailOptIns`
        # @return [Google::Apis::PartnersV2::OptIns]
        attr_accessor :email_opt_ins
      
        # A list of ids representing which markets the user was interested in.
        # Corresponds to the JSON property `markets`
        # @return [Array]
        attr_accessor :markets
      
        # If the user has edit access to multiple accounts, the user can choose the
        # preferred account and it is used when a personal account is needed. Can
        # be empty.
        # Corresponds to the JSON property `adwordsManagerAccount`
        # @return [Fixnum]
        attr_accessor :adwords_manager_account
      
        # The user's phone number.
        # Corresponds to the JSON property `phoneNumber`
        # @return [String]
        attr_accessor :phone_number
      
        # The user's primary country, an ISO 2-character code.
        # Corresponds to the JSON property `primaryCountryCode`
        # @return [String]
        attr_accessor :primary_country_code
      
        # The email address the user has selected on the Partners site as primary.
        # Corresponds to the JSON property `emailAddress`
        # @return [String]
        attr_accessor :email_address
      
        # Whether the user's public profile is visible to anyone with the URL.
        # Corresponds to the JSON property `profilePublic`
        # @return [Boolean]
        attr_accessor :profile_public
        alias_method :profile_public?, :profile_public
      
        # A list of ids representing which channels the user selected they were in.
        # Corresponds to the JSON property `channels`
        # @return [Array]
        attr_accessor :channels
      
        # A list of ids represnting which job categories the user selected.
        # Corresponds to the JSON property `jobFunctions`
        # @return [Array]
        attr_accessor :job_functions
      
        # The user's given name.
        # Corresponds to the JSON property `givenName`
        # @return [String]
        attr_accessor :given_name
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @address = args[:address] if args.key?(:address)
          @industries = args[:industries] if args.key?(:industries)
          @languages = args[:languages] if args.key?(:languages)
          @family_name = args[:family_name] if args.key?(:family_name)
          @email_opt_ins = args[:email_opt_ins] if args.key?(:email_opt_ins)
          @markets = args[:markets] if args.key?(:markets)
          @adwords_manager_account = args[:adwords_manager_account] if args.key?(:adwords_manager_account)
          @phone_number = args[:phone_number] if args.key?(:phone_number)
          @primary_country_code = args[:primary_country_code] if args.key?(:primary_country_code)
          @email_address = args[:email_address] if args.key?(:email_address)
          @profile_public = args[:profile_public] if args.key?(:profile_public)
          @channels = args[:channels] if args.key?(:channels)
          @job_functions = args[:job_functions] if args.key?(:job_functions)
          @given_name = args[:given_name] if args.key?(:given_name)
        end
      end
      
      # Response message for
      # GetPartnersStatus.
      class GetPartnersStatusResponse
        include Google::Apis::Core::Hashable
      
        # Common data that is in each API response.
        # Corresponds to the JSON property `responseMetadata`
        # @return [Google::Apis::PartnersV2::ResponseMetadata]
        attr_accessor :response_metadata
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @response_metadata = args[:response_metadata] if args.key?(:response_metadata)
        end
      end
      
      # Historical information about a Google Partners Offer.
      class HistoricalOffer
        include Google::Apis::Core::Hashable
      
        # Name (First + Last) of the partners user to whom the incentive is allocated.
        # Corresponds to the JSON property `senderName`
        # @return [String]
        attr_accessor :sender_name
      
        # Country Code for the offer country.
        # Corresponds to the JSON property `offerCountryCode`
        # @return [String]
        attr_accessor :offer_country_code
      
        # Time this offer expires.
        # Corresponds to the JSON property `expirationTime`
        # @return [String]
        attr_accessor :expiration_time
      
        # Offer code.
        # Corresponds to the JSON property `offerCode`
        # @return [String]
        attr_accessor :offer_code
      
        # Time offer was first created.
        # Corresponds to the JSON property `creationTime`
        # @return [String]
        attr_accessor :creation_time
      
        # Email address for client.
        # Corresponds to the JSON property `clientEmail`
        # @return [String]
        attr_accessor :client_email
      
        # Status of the offer.
        # Corresponds to the JSON property `status`
        # @return [String]
        attr_accessor :status
      
        # ID of client.
        # Corresponds to the JSON property `clientId`
        # @return [Fixnum]
        attr_accessor :client_id
      
        # Name of the client.
        # Corresponds to the JSON property `clientName`
        # @return [String]
        attr_accessor :client_name
      
        # Time last action was taken.
        # Corresponds to the JSON property `lastModifiedTime`
        # @return [String]
        attr_accessor :last_modified_time
      
        # Client's AdWords page URL.
        # Corresponds to the JSON property `adwordsUrl`
        # @return [String]
        attr_accessor :adwords_url
      
        # Type of offer.
        # Corresponds to the JSON property `offerType`
        # @return [String]
        attr_accessor :offer_type
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @sender_name = args[:sender_name] if args.key?(:sender_name)
          @offer_country_code = args[:offer_country_code] if args.key?(:offer_country_code)
          @expiration_time = args[:expiration_time] if args.key?(:expiration_time)
          @offer_code = args[:offer_code] if args.key?(:offer_code)
          @creation_time = args[:creation_time] if args.key?(:creation_time)
          @client_email = args[:client_email] if args.key?(:client_email)
          @status = args[:status] if args.key?(:status)
          @client_id = args[:client_id] if args.key?(:client_id)
          @client_name = args[:client_name] if args.key?(:client_name)
          @last_modified_time = args[:last_modified_time] if args.key?(:last_modified_time)
          @adwords_url = args[:adwords_url] if args.key?(:adwords_url)
          @offer_type = args[:offer_type] if args.key?(:offer_type)
        end
      end
      
      # Values to use instead of the user's respective defaults. These are only
      # honored by whitelisted products.
      class UserOverrides
        include Google::Apis::Core::Hashable
      
        # Logged-in user ID to impersonate instead of the user's ID.
        # Corresponds to the JSON property `userId`
        # @return [String]
        attr_accessor :user_id
      
        # IP address to use instead of the user's geo-located IP address.
        # Corresponds to the JSON property `ipAddress`
        # @return [String]
        attr_accessor :ip_address
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @user_id = args[:user_id] if args.key?(:user_id)
          @ip_address = args[:ip_address] if args.key?(:ip_address)
        end
      end
      
      # Request message for
      # LogUserEvent.
      class LogUserEventRequest
        include Google::Apis::Core::Hashable
      
        # The category the action belongs to.
        # Corresponds to the JSON property `eventCategory`
        # @return [String]
        attr_accessor :event_category
      
        # A lead resource that represents an advertiser contact for a `Company`. These
        # are usually generated via Google Partner Search (the advertiser portal).
        # Corresponds to the JSON property `lead`
        # @return [Google::Apis::PartnersV2::Lead]
        attr_accessor :lead
      
        # The action that occurred.
        # Corresponds to the JSON property `eventAction`
        # @return [String]
        attr_accessor :event_action
      
        # The URL where the event occurred.
        # Corresponds to the JSON property `url`
        # @return [String]
        attr_accessor :url
      
        # Common data that is in each API request.
        # Corresponds to the JSON property `requestMetadata`
        # @return [Google::Apis::PartnersV2::RequestMetadata]
        attr_accessor :request_metadata
      
        # List of event data for the event.
        # Corresponds to the JSON property `eventDatas`
        # @return [Array]
        attr_accessor :event_datas
      
        # The scope of the event.
        # Corresponds to the JSON property `eventScope`
        # @return [String]
        attr_accessor :event_scope
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @event_category = args[:event_category] if args.key?(:event_category)
          @lead = args[:lead] if args.key?(:lead)
          @event_action = args[:event_action] if args.key?(:event_action)
          @url = args[:url] if args.key?(:url)
          @request_metadata = args[:request_metadata] if args.key?(:request_metadata)
          @event_datas = args[:event_datas] if args.key?(:event_datas)
          @event_scope = args[:event_scope] if args.key?(:event_scope)
        end
      end
      
      # Details of the analytics events for a `Company` within a single day.
      class AnalyticsDataPoint
        include Google::Apis::Core::Hashable
      
        # Number of times the type of event occurred.
        # Meaning depends on context (e.g. profile views, contacts, etc.).
        # Corresponds to the JSON property `eventCount`
        # @return [Fixnum]
        attr_accessor :event_count
      
        # Location information of where these events occurred.
        # Corresponds to the JSON property `eventLocations`
        # @return [Array]
        attr_accessor :event_locations
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @event_count = args[:event_count] if args.key?(:event_count)
          @event_locations = args[:event_locations] if args.key?(:event_locations)
        end
      end
      
      # Analytics data for a `Company` within a single day.
      class Analytics
        include Google::Apis::Core::Hashable
      
        # Details of the analytics events for a `Company` within a single day.
        # Corresponds to the JSON property `contacts`
        # @return [Google::Apis::PartnersV2::AnalyticsDataPoint]
        attr_accessor :contacts
      
        # Represents a whole calendar date, e.g. date of birth. The time of day and
        # time zone are either specified elsewhere or are not significant. The date
        # is relative to the Proleptic Gregorian Calendar. The day may be 0 to
        # represent a year and month where the day is not significant, e.g. credit card
        # expiration date. The year may be 0 to represent a month and day independent
        # of year, e.g. anniversary date. Related types are google.type.TimeOfDay
        # and `google.protobuf.Timestamp`.
        # Corresponds to the JSON property `eventDate`
        # @return [Google::Apis::PartnersV2::Date]
        attr_accessor :event_date
      
        # Details of the analytics events for a `Company` within a single day.
        # Corresponds to the JSON property `profileViews`
        # @return [Google::Apis::PartnersV2::AnalyticsDataPoint]
        attr_accessor :profile_views
      
        # Details of the analytics events for a `Company` within a single day.
        # Corresponds to the JSON property `searchViews`
        # @return [Google::Apis::PartnersV2::AnalyticsDataPoint]
        attr_accessor :search_views
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @contacts = args[:contacts] if args.key?(:contacts)
          @event_date = args[:event_date] if args.key?(:event_date)
          @profile_views = args[:profile_views] if args.key?(:profile_views)
          @search_views = args[:search_views] if args.key?(:search_views)
        end
      end
      
      # Basic information from a public profile.
      class PublicProfile
        include Google::Apis::Core::Hashable
      
        # The ID which can be used to retrieve more details about the public profile.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # The URL of the public profile.
        # Corresponds to the JSON property `url`
        # @return [String]
        attr_accessor :url
      
        # The URL to the main profile image of the public profile.
        # Corresponds to the JSON property `profileImage`
        # @return [String]
        attr_accessor :profile_image
      
        # The display name of the public profile.
        # Corresponds to the JSON property `displayName`
        # @return [String]
        attr_accessor :display_name
      
        # The URL to the main display image of the public profile. Being deprecated.
        # Corresponds to the JSON property `displayImageUrl`
        # @return [String]
        attr_accessor :display_image_url
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @id = args[:id] if args.key?(:id)
          @url = args[:url] if args.key?(:url)
          @profile_image = args[:profile_image] if args.key?(:profile_image)
          @display_name = args[:display_name] if args.key?(:display_name)
          @display_image_url = args[:display_image_url] if args.key?(:display_image_url)
        end
      end
      
      # Information about a particular AdWords Manager Account.
      # Read more at https://support.google.com/adwords/answer/6139186
      class AdWordsManagerAccountInfo
        include Google::Apis::Core::Hashable
      
        # The AdWords Manager Account id.
        # Corresponds to the JSON property `id`
        # @return [Fixnum]
        attr_accessor :id
      
        # Name of the customer this account represents.
        # Corresponds to the JSON property `customerName`
        # @return [String]
        attr_accessor :customer_name
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @id = args[:id] if args.key?(:id)
          @customer_name = args[:customer_name] if args.key?(:customer_name)
        end
      end
      
      # Common data that is in each API response.
      class ResponseMetadata
        include Google::Apis::Core::Hashable
      
        # Debug information about this request.
        # Corresponds to the JSON property `debugInfo`
        # @return [Google::Apis::PartnersV2::DebugInfo]
        attr_accessor :debug_info
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @debug_info = args[:debug_info] if args.key?(:debug_info)
        end
      end
      
      # reCaptcha challenge info.
      class RecaptchaChallenge
        include Google::Apis::Core::Hashable
      
        # The ID of the reCaptcha challenge.
        # Corresponds to the JSON property `id`
        # @return [String]
        attr_accessor :id
      
        # The response to the reCaptcha challenge.
        # Corresponds to the JSON property `response`
        # @return [String]
        attr_accessor :response
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @id = args[:id] if args.key?(:id)
          @response = args[:response] if args.key?(:response)
        end
      end
      
      # Available Offers to be distributed.
      class AvailableOffer
        include Google::Apis::Core::Hashable
      
        # Level of this offer.
        # Corresponds to the JSON property `offerLevel`
        # @return [String]
        attr_accessor :offer_level
      
        # Name of the offer.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # ID of this offer.
        # Corresponds to the JSON property `id`
        # @return [Fixnum]
        attr_accessor :id
      
        # Whether or not the list of qualified customers is definitely complete.
        # Corresponds to the JSON property `qualifiedCustomersComplete`
        # @return [Boolean]
        attr_accessor :qualified_customers_complete
        alias_method :qualified_customers_complete?, :qualified_customers_complete
      
        # Offer info by country.
        # Corresponds to the JSON property `countryOfferInfos`
        # @return [Array]
        attr_accessor :country_offer_infos
      
        # Type of offer.
        # Corresponds to the JSON property `offerType`
        # @return [String]
        attr_accessor :offer_type
      
        # The maximum age of an account [in days] to be eligible.
        # Corresponds to the JSON property `maxAccountAge`
        # @return [Fixnum]
        attr_accessor :max_account_age
      
        # Customers who qualify for this offer.
        # Corresponds to the JSON property `qualifiedCustomer`
        # @return [Array]
        attr_accessor :qualified_customer
      
        # Terms of the offer.
        # Corresponds to the JSON property `terms`
        # @return [String]
        attr_accessor :terms
      
        # Should special text be shown on the offers page.
        # Corresponds to the JSON property `showSpecialOfferCopy`
        # @return [Boolean]
        attr_accessor :show_special_offer_copy
        alias_method :show_special_offer_copy?, :show_special_offer_copy
      
        # The number of codes for this offer that are available for distribution.
        # Corresponds to the JSON property `available`
        # @return [Fixnum]
        attr_accessor :available
      
        # Description of the offer.
        # Corresponds to the JSON property `description`
        # @return [String]
        attr_accessor :description
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @offer_level = args[:offer_level] if args.key?(:offer_level)
          @name = args[:name] if args.key?(:name)
          @id = args[:id] if args.key?(:id)
          @qualified_customers_complete = args[:qualified_customers_complete] if args.key?(:qualified_customers_complete)
          @country_offer_infos = args[:country_offer_infos] if args.key?(:country_offer_infos)
          @offer_type = args[:offer_type] if args.key?(:offer_type)
          @max_account_age = args[:max_account_age] if args.key?(:max_account_age)
          @qualified_customer = args[:qualified_customer] if args.key?(:qualified_customer)
          @terms = args[:terms] if args.key?(:terms)
          @show_special_offer_copy = args[:show_special_offer_copy] if args.key?(:show_special_offer_copy)
          @available = args[:available] if args.key?(:available)
          @description = args[:description] if args.key?(:description)
        end
      end
    end
  end
end