/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is
 * regenerated.
 */

'use strict';

const msRest = require('ms-rest');
const WebResource = msRest.WebResource;

/**
 * @summary The Custom Image Search API lets you send an image search query to
 * Bing and get image results found in your custom view of the web.
 *
 * @param {string} customConfig The identifier for the custom search
 * configuration
 *
 * @param {string} query The user's search query term. The term cannot be
 * empty. The term may contain [Bing Advanced
 * Operators](http://msdn.microsoft.com/library/ff795620.aspx). For example, to
 * limit images to a specific domain, use the
 * [site:](http://msdn.microsoft.com/library/ff795613.aspx) operator. To help
 * improve relevance of an insights query (see
 * [insightsToken](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#insightstoken)),
 * you should always include the user's query term. Use this parameter only
 * with the Image Search API.Do not specify this parameter when calling the
 * Trending Images API.
 *
 * @param {object} [options] Optional Parameters.
 *
 * @param {string} [options.acceptLanguage] A comma-delimited list of one or
 * more languages to use for user interface strings. The list is in decreasing
 * order of preference. For additional information, including expected format,
 * see [RFC2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). This
 * header and the
 * [setLang](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#setlang)
 * query parameter are mutually exclusive; do not specify both. If you set this
 * header, you must also specify the
 * [cc](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#cc)
 * query parameter. To determine the market to return results for, Bing uses
 * the first supported language it finds from the list and combines it with the
 * cc parameter value. If the list does not include a supported language, Bing
 * finds the closest language and market that supports the request or it uses
 * an aggregated or default market for the results. To determine the market
 * that Bing used, see the BingAPIs-Market header. Use this header and the cc
 * query parameter only if you specify multiple languages. Otherwise, use the
 * [mkt](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#mkt)
 * and
 * [setLang](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#setlang)
 * query parameters. A user interface string is a string that's used as a label
 * in a user interface. There are few user interface strings in the JSON
 * response objects. Any links to Bing.com properties in the response objects
 * apply the specified language.
 *
 * @param {string} [options.userAgent] The user agent originating the request.
 * Bing uses the user agent to provide mobile users with an optimized
 * experience. Although optional, you are encouraged to always specify this
 * header. The user-agent should be the same string that any commonly used
 * browser sends. For information about user agents, see [RFC
 * 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). The following
 * are examples of user-agent strings. Windows Phone: Mozilla/5.0 (compatible;
 * MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA;
 * Lumia 822). Android: Mozilla / 5.0 (Linux; U; Android 2.3.5; en - us; SCH -
 * I500 Build / GINGERBREAD) AppleWebKit / 533.1 (KHTML; like Gecko) Version /
 * 4.0 Mobile Safari / 533.1. iPhone: Mozilla / 5.0 (iPhone; CPU iPhone OS 6_1
 * like Mac OS X) AppleWebKit / 536.26 (KHTML; like Gecko) Mobile / 10B142
 * iPhone4; 1 BingWeb / 3.03.1428.20120423. PC: Mozilla / 5.0 (Windows NT 6.3;
 * WOW64; Trident / 7.0; Touch; rv:11.0) like Gecko. iPad: Mozilla / 5.0 (iPad;
 * CPU OS 7_0 like Mac OS X) AppleWebKit / 537.51.1 (KHTML, like Gecko) Version
 * / 7.0 Mobile / 11A465 Safari / 9537.53
 *
 * @param {string} [options.clientId] Bing uses this header to provide users
 * with consistent behavior across Bing API calls. Bing often flights new
 * features and improvements, and it uses the client ID as a key for assigning
 * traffic on different flights. If you do not use the same client ID for a
 * user across multiple requests, then Bing may assign the user to multiple
 * conflicting flights. Being assigned to multiple conflicting flights can lead
 * to an inconsistent user experience. For example, if the second request has a
 * different flight assignment than the first, the experience may be
 * unexpected. Also, Bing can use the client ID to tailor web results to that
 * client ID’s search history, providing a richer experience for the user. Bing
 * also uses this header to help improve result rankings by analyzing the
 * activity generated by a client ID. The relevance improvements help with
 * better quality of results delivered by Bing APIs and in turn enables higher
 * click-through rates for the API consumer. IMPORTANT: Although optional, you
 * should consider this header required. Persisting the client ID across
 * multiple requests for the same end user and device combination enables 1)
 * the API consumer to receive a consistent user experience, and 2) higher
 * click-through rates via better quality of results from the Bing APIs. Each
 * user that uses your application on the device must have a unique, Bing
 * generated client ID. If you do not include this header in the request, Bing
 * generates an ID and returns it in the X-MSEdge-ClientID response header. The
 * only time that you should NOT include this header in a request is the first
 * time the user uses your app on that device. Use the client ID for each Bing
 * API request that your app makes for this user on the device. Persist the
 * client ID. To persist the ID in a browser app, use a persistent HTTP cookie
 * to ensure the ID is used across all sessions. Do not use a session cookie.
 * For other apps such as mobile apps, use the device's persistent storage to
 * persist the ID. The next time the user uses your app on that device, get the
 * client ID that you persisted. Bing responses may or may not include this
 * header. If the response includes this header, capture the client ID and use
 * it for all subsequent Bing requests for the user on that device. If you
 * include the X-MSEdge-ClientID, you must not include cookies in the request.
 *
 * @param {string} [options.clientIp] The IPv4 or IPv6 address of the client
 * device. The IP address is used to discover the user's location. Bing uses
 * the location information to determine safe search behavior. Although
 * optional, you are encouraged to always specify this header and the
 * X-Search-Location header. Do not obfuscate the address (for example, by
 * changing the last octet to 0). Obfuscating the address results in the
 * location not being anywhere near the device's actual location, which may
 * result in Bing serving erroneous results.
 *
 * @param {string} [options.location] A semicolon-delimited list of key/value
 * pairs that describe the client's geographical location. Bing uses the
 * location information to determine safe search behavior and to return
 * relevant local content. Specify the key/value pair as <key>:<value>. The
 * following are the keys that you use to specify the user's location. lat
 * (required): The latitude of the client's location, in degrees. The latitude
 * must be greater than or equal to -90.0 and less than or equal to +90.0.
 * Negative values indicate southern latitudes and positive values indicate
 * northern latitudes. long (required): The longitude of the client's location,
 * in degrees. The longitude must be greater than or equal to -180.0 and less
 * than or equal to +180.0. Negative values indicate western longitudes and
 * positive values indicate eastern longitudes. re (required): The radius, in
 * meters, which specifies the horizontal accuracy of the coordinates. Pass the
 * value returned by the device's location service. Typical values might be 22m
 * for GPS/Wi-Fi, 380m for cell tower triangulation, and 18,000m for reverse IP
 * lookup. ts (optional): The UTC UNIX timestamp of when the client was at the
 * location. (The UNIX timestamp is the number of seconds since January 1,
 * 1970.) head (optional): The client's relative heading or direction of
 * travel. Specify the direction of travel as degrees from 0 through 360,
 * counting clockwise relative to true north. Specify this key only if the sp
 * key is nonzero. sp (optional): The horizontal velocity (speed), in meters
 * per second, that the client device is traveling. alt (optional): The
 * altitude of the client device, in meters. are (optional): The radius, in
 * meters, that specifies the vertical accuracy of the coordinates. Specify
 * this key only if you specify the alt key. Although many of the keys are
 * optional, the more information that you provide, the more accurate the
 * location results are. Although optional, you are encouraged to always
 * specify the user's geographical location. Providing the location is
 * especially important if the client's IP address does not accurately reflect
 * the user's physical location (for example, if the client uses VPN). For
 * optimal results, you should include this header and the X-MSEdge-ClientIP
 * header, but at a minimum, you should include this header.
 *
 * @param {string} [options.aspect] Filter images by the following aspect
 * ratios. All: Do not filter by aspect.Specifying this value is the same as
 * not specifying the aspect parameter. Square: Return images with standard
 * aspect ratio. Wide: Return images with wide screen aspect ratio. Tall:
 * Return images with tall aspect ratio. Possible values include: 'All',
 * 'Square', 'Wide', 'Tall'
 *
 * @param {string} [options.color] Filter images by the following color
 * options. ColorOnly: Return color images. Monochrome: Return black and white
 * images. Return images with one of the following dominant colors: Black,
 * Blue, Brown, Gray, Green, Orange, Pink, Purple, Red, Teal, White, Yellow.
 * Possible values include: 'ColorOnly', 'Monochrome', 'Black', 'Blue',
 * 'Brown', 'Gray', 'Green', 'Orange', 'Pink', 'Purple', 'Red', 'Teal',
 * 'White', 'Yellow'
 *
 * @param {string} [options.countryCode] A 2-character country code of the
 * country where the results come from. For a list of possible values, see
 * [Market
 * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes).
 * If you set this parameter, you must also specify the
 * [Accept-Language](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#acceptlanguage)
 * header. Bing uses the first supported language it finds from the languages
 * list, and combine that language with the country code that you specify to
 * determine the market to return results for. If the languages list does not
 * include a supported language, Bing finds the closest language and market
 * that supports the request, or it may use an aggregated or default market for
 * the results instead of a specified one. You should use this query parameter
 * and the Accept-Language query parameter only if you specify multiple
 * languages; otherwise, you should use the mkt and setLang query parameters.
 * This parameter and the
 * [mkt](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#mkt)
 * query parameter are mutually exclusive—do not specify both.
 *
 * @param {number} [options.count] The number of images to return in the
 * response. The actual number delivered may be less than requested. The
 * default is 35. The maximum value is 150. You use this parameter along with
 * the offset parameter to page results.For example, if your user interface
 * displays 20 images per page, set count to 20 and offset to 0 to get the
 * first page of results.For each subsequent page, increment offset by 20 (for
 * example, 0, 20, 40). Use this parameter only with the Image Search API.Do
 * not specify this parameter when calling the Insights, Trending Images, or
 * Web Search APIs.
 *
 * @param {string} [options.freshness] Filter images by the following discovery
 * options. Day: Return images discovered by Bing within the last 24 hours.
 * Week: Return images discovered by Bing within the last 7 days. Month: Return
 * images discovered by Bing within the last 30 days. Possible values include:
 * 'Day', 'Week', 'Month'
 *
 * @param {number} [options.height] Filter images that have the specified
 * height, in pixels. You may use this filter with the size filter to return
 * small images that have a height of 150 pixels.
 *
 * @param {string} [options.id] An ID that uniquely identifies an image. Use
 * this parameter to ensure that the specified image is the first image in the
 * list of images that Bing returns. The
 * [Image](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#image)
 * object's imageId field contains the ID that you set this parameter to.
 *
 * @param {string} [options.imageContent] Filter images by the following
 * content types. Face: Return images that show only a person's face. Portrait:
 * Return images that show only a person's head and shoulders. Possible values
 * include: 'Face', 'Portrait'
 *
 * @param {string} [options.imageType] Filter images by the following image
 * types. AnimatedGif: Return only animated GIFs. Clipart: Return only clip art
 * images. Line: Return only line drawings. Photo: Return only
 * photographs(excluding line drawings, animated Gifs, and clip art). Shopping:
 * Return only images that contain items where Bing knows of a merchant that is
 * selling the items. This option is valid in the en - US market
 * only.Transparent: Return only images with a transparent background. Possible
 * values include: 'AnimatedGif', 'Clipart', 'Line', 'Photo', 'Shopping',
 * 'Transparent'
 *
 * @param {string} [options.license] Filter images by the following license
 * types. All: Do not filter by license type.Specifying this value is the same
 * as not specifying the license parameter. Any: Return images that are under
 * any license type. The response doesn't include images that do not specify a
 * license or the license is unknown. Public: Return images where the creator
 * has waived their exclusive rights, to the fullest extent allowed by law.
 * Share: Return images that may be shared with others. Changing or editing the
 * image might not be allowed. Also, modifying, sharing, and using the image
 * for commercial purposes might not be allowed. Typically, this option returns
 * the most images. ShareCommercially: Return images that may be shared with
 * others for personal or commercial purposes. Changing or editing the image
 * might not be allowed. Modify: Return images that may be modified, shared,
 * and used. Changing or editing the image might not be allowed. Modifying,
 * sharing, and using the image for commercial purposes might not be allowed.
 * ModifyCommercially: Return images that may be modified, shared, and used for
 * personal or commercial purposes. Typically, this option returns the fewest
 * images. For more information about these license types, see [Filter Images
 * By License Type](http://go.microsoft.com/fwlink/?LinkId=309768). Possible
 * values include: 'All', 'Any', 'Public', 'Share', 'ShareCommercially',
 * 'Modify', 'ModifyCommercially'
 *
 * @param {string} [options.market] The market where the results come from.
 * Typically, mkt is the country where the user is making the request from.
 * However, it could be a different country if the user is not located in a
 * country where Bing delivers results. The market must be in the form
 * <language code>-<country code>. For example, en-US. The string is case
 * insensitive. For a list of possible market values, see [Market
 * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes).
 * NOTE: If known, you are encouraged to always specify the market. Specifying
 * the market helps Bing route the request and return an appropriate and
 * optimal response. If you specify a market that is not listed in [Market
 * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes),
 * Bing uses a best fit market code based on an internal mapping that is
 * subject to change. This parameter and the
 * [cc](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#cc)
 * query parameter are mutually exclusive—do not specify both.
 *
 * @param {number} [options.maxFileSize] Filter images that are less than or
 * equal to the specified file size. The maximum file size that you may specify
 * is 520,192 bytes. If you specify a larger value, the API uses 520,192. It is
 * possible that the response may include images that are slightly larger than
 * the specified maximum. You may specify this filter and minFileSize to filter
 * images within a range of file sizes.
 *
 * @param {number} [options.maxHeight] Filter images that have a height that is
 * less than or equal to the specified height. Specify the height in pixels.
 * You may specify this filter and minHeight to filter images within a range of
 * heights. This filter and the height filter are mutually exclusive.
 *
 * @param {number} [options.maxWidth] Filter images that have a width that is
 * less than or equal to the specified width. Specify the width in pixels. You
 * may specify this filter and maxWidth to filter images within a range of
 * widths. This filter and the width filter are mutually exclusive.
 *
 * @param {number} [options.minFileSize] Filter images that are greater than or
 * equal to the specified file size. The maximum file size that you may specify
 * is 520,192 bytes. If you specify a larger value, the API uses 520,192. It is
 * possible that the response may include images that are slightly smaller than
 * the specified minimum. You may specify this filter and maxFileSize to filter
 * images within a range of file sizes.
 *
 * @param {number} [options.minHeight] Filter images that have a height that is
 * greater than or equal to the specified height. Specify the height in pixels.
 * You may specify this filter and maxHeight to filter images within a range of
 * heights. This filter and the height filter are mutually exclusive.
 *
 * @param {number} [options.minWidth] Filter images that have a width that is
 * greater than or equal to the specified width. Specify the width in pixels.
 * You may specify this filter and maxWidth to filter images within a range of
 * widths. This filter and the width filter are mutually exclusive.
 *
 * @param {number} [options.offset] The zero-based offset that indicates the
 * number of images to skip before returning images. The default is 0. The
 * offset should be less than
 * ([totalEstimatedMatches](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#totalestimatedmatches)
 * - count). Use this parameter along with the count parameter to page results.
 * For example, if your user interface displays 20 images per page, set count
 * to 20 and offset to 0 to get the first page of results. For each subsequent
 * page, increment offset by 20 (for example, 0, 20, 40). It is possible for
 * multiple pages to include some overlap in results. To prevent duplicates,
 * see
 * [nextOffset](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#nextoffset).
 * Use this parameter only with the Image API. Do not specify this parameter
 * when calling the Trending Images API or the Web Search API.
 *
 * @param {string} [options.safeSearch] Filter images for adult content. The
 * following are the possible filter values. Off: May return images with adult
 * content. If the request is through the Image Search API, the response
 * includes thumbnail images that are clear (non-fuzzy). However, if the
 * request is through the Web Search API, the response includes thumbnail
 * images that are pixelated (fuzzy). Moderate: If the request is through the
 * Image Search API, the response doesn't include images with adult content. If
 * the request is through the Web Search API, the response may include images
 * with adult content (the thumbnail images are pixelated (fuzzy)). Strict: Do
 * not return images with adult content. The default is Moderate. If the
 * request comes from a market that Bing's adult policy requires that
 * safeSearch is set to Strict, Bing ignores the safeSearch value and uses
 * Strict. If you use the site: query operator, there is the chance that the
 * response may contain adult content regardless of what the safeSearch query
 * parameter is set to. Use site: only if you are aware of the content on the
 * site and your scenario supports the possibility of adult content. Possible
 * values include: 'Off', 'Moderate', 'Strict'
 *
 * @param {string} [options.size] Filter images by the following sizes. All: Do
 * not filter by size. Specifying this value is the same as not specifying the
 * size parameter. Small: Return images that are less than 200x200 pixels.
 * Medium: Return images that are greater than or equal to 200x200 pixels but
 * less than 500x500 pixels. Large: Return images that are 500x500 pixels or
 * larger. Wallpaper: Return wallpaper images. You may use this parameter along
 * with the height or width parameters. For example, you may use height and
 * size to request small images that are 150 pixels tall. Possible values
 * include: 'All', 'Small', 'Medium', 'Large', 'Wallpaper'
 *
 * @param {string} [options.setLang] The language to use for user interface
 * strings. Specify the language using the ISO 639-1 2-letter language code.
 * For example, the language code for English is EN. The default is EN
 * (English). Although optional, you should always specify the language.
 * Typically, you set setLang to the same language specified by mkt unless the
 * user wants the user interface strings displayed in a different language.
 * This parameter and the
 * [Accept-Language](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#acceptlanguage)
 * header are mutually exclusive; do not specify both. A user interface string
 * is a string that's used as a label in a user interface. There are few user
 * interface strings in the JSON response objects. Also, any links to Bing.com
 * properties in the response objects apply the specified language.
 *
 * @param {number} [options.width] Filter images that have the specified width,
 * in pixels. You may use this filter with the size filter to return small
 * images that have a width of 150 pixels.
 *
 * @param {object} [options.customHeaders] Headers that will be added to the
 * request
 *
 * @param {function} callback - The callback.
 *
 * @returns {function} callback(err, result, request, response)
 *
 *                      {Error}  err        - The Error object if an error occurred, null otherwise.
 *
 *                      {object} [result]   - The deserialized result object if an error did not occur.
 *                      See {@link Images} for more information.
 *
 *                      {object} [request]  - The HTTP Request object if an error did not occur.
 *
 *                      {stream} [response] - The HTTP Response stream if an error did not occur.
 */
function _imageSearch(customConfig, query, options, callback) {
   /* jshint validthis: true */
  let client = this.client;
  if(!callback && typeof options === 'function') {
    callback = options;
    options = null;
  }
  if (!callback) {
    throw new Error('callback cannot be null.');
  }
  let acceptLanguage = (options && options.acceptLanguage !== undefined) ? options.acceptLanguage : undefined;
  let userAgent = (options && options.userAgent !== undefined) ? options.userAgent : undefined;
  let clientId = (options && options.clientId !== undefined) ? options.clientId : undefined;
  let clientIp = (options && options.clientIp !== undefined) ? options.clientIp : undefined;
  let location = (options && options.location !== undefined) ? options.location : undefined;
  let aspect = (options && options.aspect !== undefined) ? options.aspect : undefined;
  let color = (options && options.color !== undefined) ? options.color : undefined;
  let countryCode = (options && options.countryCode !== undefined) ? options.countryCode : undefined;
  let count = (options && options.count !== undefined) ? options.count : undefined;
  let freshness = (options && options.freshness !== undefined) ? options.freshness : undefined;
  let height = (options && options.height !== undefined) ? options.height : undefined;
  let id = (options && options.id !== undefined) ? options.id : undefined;
  let imageContent = (options && options.imageContent !== undefined) ? options.imageContent : undefined;
  let imageType = (options && options.imageType !== undefined) ? options.imageType : undefined;
  let license = (options && options.license !== undefined) ? options.license : undefined;
  let market = (options && options.market !== undefined) ? options.market : undefined;
  let maxFileSize = (options && options.maxFileSize !== undefined) ? options.maxFileSize : undefined;
  let maxHeight = (options && options.maxHeight !== undefined) ? options.maxHeight : undefined;
  let maxWidth = (options && options.maxWidth !== undefined) ? options.maxWidth : undefined;
  let minFileSize = (options && options.minFileSize !== undefined) ? options.minFileSize : undefined;
  let minHeight = (options && options.minHeight !== undefined) ? options.minHeight : undefined;
  let minWidth = (options && options.minWidth !== undefined) ? options.minWidth : undefined;
  let offset = (options && options.offset !== undefined) ? options.offset : undefined;
  let safeSearch = (options && options.safeSearch !== undefined) ? options.safeSearch : undefined;
  let size = (options && options.size !== undefined) ? options.size : undefined;
  let setLang = (options && options.setLang !== undefined) ? options.setLang : undefined;
  let width = (options && options.width !== undefined) ? options.width : undefined;
  let xBingApisSDK = 'true';
  // Validate
  try {
    if (this.client.endpoint === null || this.client.endpoint === undefined || typeof this.client.endpoint.valueOf() !== 'string') {
      throw new Error('this.client.endpoint cannot be null or undefined and it must be of type string.');
    }
    if (acceptLanguage !== null && acceptLanguage !== undefined && typeof acceptLanguage.valueOf() !== 'string') {
      throw new Error('acceptLanguage must be of type string.');
    }
    if (userAgent !== null && userAgent !== undefined && typeof userAgent.valueOf() !== 'string') {
      throw new Error('userAgent must be of type string.');
    }
    if (clientId !== null && clientId !== undefined && typeof clientId.valueOf() !== 'string') {
      throw new Error('clientId must be of type string.');
    }
    if (clientIp !== null && clientIp !== undefined && typeof clientIp.valueOf() !== 'string') {
      throw new Error('clientIp must be of type string.');
    }
    if (location !== null && location !== undefined && typeof location.valueOf() !== 'string') {
      throw new Error('location must be of type string.');
    }
    if (customConfig === null || customConfig === undefined || typeof customConfig.valueOf() !== 'string') {
      throw new Error('customConfig cannot be null or undefined and it must be of type string.');
    }
    if (aspect !== null && aspect !== undefined && typeof aspect.valueOf() !== 'string') {
      throw new Error('aspect must be of type string.');
    }
    if (color !== null && color !== undefined && typeof color.valueOf() !== 'string') {
      throw new Error('color must be of type string.');
    }
    if (countryCode !== null && countryCode !== undefined && typeof countryCode.valueOf() !== 'string') {
      throw new Error('countryCode must be of type string.');
    }
    if (count !== null && count !== undefined && typeof count !== 'number') {
      throw new Error('count must be of type number.');
    }
    if (freshness !== null && freshness !== undefined && typeof freshness.valueOf() !== 'string') {
      throw new Error('freshness must be of type string.');
    }
    if (height !== null && height !== undefined && typeof height !== 'number') {
      throw new Error('height must be of type number.');
    }
    if (id !== null && id !== undefined && typeof id.valueOf() !== 'string') {
      throw new Error('id must be of type string.');
    }
    if (imageContent !== null && imageContent !== undefined && typeof imageContent.valueOf() !== 'string') {
      throw new Error('imageContent must be of type string.');
    }
    if (imageType !== null && imageType !== undefined && typeof imageType.valueOf() !== 'string') {
      throw new Error('imageType must be of type string.');
    }
    if (license !== null && license !== undefined && typeof license.valueOf() !== 'string') {
      throw new Error('license must be of type string.');
    }
    if (market !== null && market !== undefined && typeof market.valueOf() !== 'string') {
      throw new Error('market must be of type string.');
    }
    if (maxFileSize !== null && maxFileSize !== undefined && typeof maxFileSize !== 'number') {
      throw new Error('maxFileSize must be of type number.');
    }
    if (maxHeight !== null && maxHeight !== undefined && typeof maxHeight !== 'number') {
      throw new Error('maxHeight must be of type number.');
    }
    if (maxWidth !== null && maxWidth !== undefined && typeof maxWidth !== 'number') {
      throw new Error('maxWidth must be of type number.');
    }
    if (minFileSize !== null && minFileSize !== undefined && typeof minFileSize !== 'number') {
      throw new Error('minFileSize must be of type number.');
    }
    if (minHeight !== null && minHeight !== undefined && typeof minHeight !== 'number') {
      throw new Error('minHeight must be of type number.');
    }
    if (minWidth !== null && minWidth !== undefined && typeof minWidth !== 'number') {
      throw new Error('minWidth must be of type number.');
    }
    if (offset !== null && offset !== undefined && typeof offset !== 'number') {
      throw new Error('offset must be of type number.');
    }
    if (query === null || query === undefined || typeof query.valueOf() !== 'string') {
      throw new Error('query cannot be null or undefined and it must be of type string.');
    }
    if (safeSearch !== null && safeSearch !== undefined && typeof safeSearch.valueOf() !== 'string') {
      throw new Error('safeSearch must be of type string.');
    }
    if (size !== null && size !== undefined && typeof size.valueOf() !== 'string') {
      throw new Error('size must be of type string.');
    }
    if (setLang !== null && setLang !== undefined && typeof setLang.valueOf() !== 'string') {
      throw new Error('setLang must be of type string.');
    }
    if (width !== null && width !== undefined && typeof width !== 'number') {
      throw new Error('width must be of type number.');
    }
  } catch (error) {
    return callback(error);
  }

  // Construct URL
  let baseUrl = this.client.baseUri;
  let requestUrl = baseUrl + (baseUrl.endsWith('/') ? '' : '/') + 'images/search';
  requestUrl = requestUrl.replace('{Endpoint}', this.client.endpoint);
  let queryParameters = [];
  queryParameters.push('customConfig=' + encodeURIComponent(customConfig));
  if (aspect !== null && aspect !== undefined) {
    queryParameters.push('aspect=' + encodeURIComponent(aspect));
  }
  if (color !== null && color !== undefined) {
    queryParameters.push('color=' + encodeURIComponent(color));
  }
  if (countryCode !== null && countryCode !== undefined) {
    queryParameters.push('cc=' + encodeURIComponent(countryCode));
  }
  if (count !== null && count !== undefined) {
    queryParameters.push('count=' + encodeURIComponent(count.toString()));
  }
  if (freshness !== null && freshness !== undefined) {
    queryParameters.push('freshness=' + encodeURIComponent(freshness));
  }
  if (height !== null && height !== undefined) {
    queryParameters.push('height=' + encodeURIComponent(height.toString()));
  }
  if (id !== null && id !== undefined) {
    queryParameters.push('id=' + encodeURIComponent(id));
  }
  if (imageContent !== null && imageContent !== undefined) {
    queryParameters.push('imageContent=' + encodeURIComponent(imageContent));
  }
  if (imageType !== null && imageType !== undefined) {
    queryParameters.push('imageType=' + encodeURIComponent(imageType));
  }
  if (license !== null && license !== undefined) {
    queryParameters.push('license=' + encodeURIComponent(license));
  }
  if (market !== null && market !== undefined) {
    queryParameters.push('mkt=' + encodeURIComponent(market));
  }
  if (maxFileSize !== null && maxFileSize !== undefined) {
    queryParameters.push('maxFileSize=' + encodeURIComponent(maxFileSize.toString()));
  }
  if (maxHeight !== null && maxHeight !== undefined) {
    queryParameters.push('maxHeight=' + encodeURIComponent(maxHeight.toString()));
  }
  if (maxWidth !== null && maxWidth !== undefined) {
    queryParameters.push('maxWidth=' + encodeURIComponent(maxWidth.toString()));
  }
  if (minFileSize !== null && minFileSize !== undefined) {
    queryParameters.push('minFileSize=' + encodeURIComponent(minFileSize.toString()));
  }
  if (minHeight !== null && minHeight !== undefined) {
    queryParameters.push('minHeight=' + encodeURIComponent(minHeight.toString()));
  }
  if (minWidth !== null && minWidth !== undefined) {
    queryParameters.push('minWidth=' + encodeURIComponent(minWidth.toString()));
  }
  if (offset !== null && offset !== undefined) {
    queryParameters.push('offset=' + encodeURIComponent(offset.toString()));
  }
  queryParameters.push('q=' + encodeURIComponent(query));
  if (safeSearch !== null && safeSearch !== undefined) {
    queryParameters.push('safeSearch=' + encodeURIComponent(safeSearch));
  }
  if (size !== null && size !== undefined) {
    queryParameters.push('size=' + encodeURIComponent(size));
  }
  if (setLang !== null && setLang !== undefined) {
    queryParameters.push('setLang=' + encodeURIComponent(setLang));
  }
  if (width !== null && width !== undefined) {
    queryParameters.push('width=' + encodeURIComponent(width.toString()));
  }
  if (queryParameters.length > 0) {
    requestUrl += '?' + queryParameters.join('&');
  }

  // Create HTTP transport objects
  let httpRequest = new WebResource();
  httpRequest.method = 'GET';
  httpRequest.url = requestUrl;
  httpRequest.headers = {};
  // Set Headers
  httpRequest.headers['Content-Type'] = 'application/json; charset=utf-8';
  if (xBingApisSDK !== undefined && xBingApisSDK !== null) {
    httpRequest.headers['X-BingApis-SDK'] = xBingApisSDK;
  }
  if (acceptLanguage !== undefined && acceptLanguage !== null) {
    httpRequest.headers['Accept-Language'] = acceptLanguage;
  }
  if (userAgent !== undefined && userAgent !== null) {
    httpRequest.headers['User-Agent'] = userAgent;
  }
  if (clientId !== undefined && clientId !== null) {
    httpRequest.headers['X-MSEdge-ClientID'] = clientId;
  }
  if (clientIp !== undefined && clientIp !== null) {
    httpRequest.headers['X-MSEdge-ClientIP'] = clientIp;
  }
  if (location !== undefined && location !== null) {
    httpRequest.headers['X-Search-Location'] = location;
  }
  if(options) {
    for(let headerName in options['customHeaders']) {
      if (options['customHeaders'].hasOwnProperty(headerName)) {
        httpRequest.headers[headerName] = options['customHeaders'][headerName];
      }
    }
  }
  httpRequest.body = null;
  // Send Request
  return client.pipeline(httpRequest, (err, response, responseBody) => {
    if (err) {
      return callback(err);
    }
    let statusCode = response.statusCode;
    if (statusCode !== 200) {
      let error = new Error(responseBody);
      error.statusCode = response.statusCode;
      error.request = msRest.stripRequest(httpRequest);
      error.response = msRest.stripResponse(response);
      if (responseBody === '') responseBody = null;
      let parsedErrorResponse;
      try {
        parsedErrorResponse = JSON.parse(responseBody);
        if (parsedErrorResponse) {
          let internalError = null;
          if (parsedErrorResponse.error) internalError = parsedErrorResponse.error;
          error.code = internalError ? internalError.code : parsedErrorResponse.code;
          error.message = internalError ? internalError.message : parsedErrorResponse.message;
        }
        if (parsedErrorResponse !== null && parsedErrorResponse !== undefined) {
          let resultMapper = new client.models['ErrorResponse']().mapper();
          error.body = client.deserialize(resultMapper, parsedErrorResponse, 'error.body');
        }
      } catch (defaultError) {
        error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody ` +
                         `- "${responseBody}" for the default response.`;
        return callback(error);
      }
      return callback(error);
    }
    // Create Result
    let result = null;
    if (responseBody === '') responseBody = null;
    // Deserialize Response
    if (statusCode === 200) {
      let parsedResponse = null;
      try {
        parsedResponse = JSON.parse(responseBody);
        result = JSON.parse(responseBody);
        if (parsedResponse !== null && parsedResponse !== undefined) {
          let resultMapper = new client.models['Images']().mapper();
          result = client.deserialize(resultMapper, parsedResponse, 'result');
        }
      } catch (error) {
        let deserializationError = new Error(`Error ${error} occurred in deserializing the responseBody - ${responseBody}`);
        deserializationError.request = msRest.stripRequest(httpRequest);
        deserializationError.response = msRest.stripResponse(response);
        return callback(deserializationError);
      }
    }

    return callback(null, result, httpRequest, response);
  });
}

/** Class representing a CustomInstance. */
class CustomInstance {
  /**
   * Create a CustomInstance.
   * @param {CustomImageSearchClient} client Reference to the service client.
   */
  constructor(client) {
    this.client = client;
    this._imageSearch = _imageSearch;
  }

  /**
   * @summary The Custom Image Search API lets you send an image search query to
   * Bing and get image results found in your custom view of the web.
   *
   * @param {string} customConfig The identifier for the custom search
   * configuration
   *
   * @param {string} query The user's search query term. The term cannot be
   * empty. The term may contain [Bing Advanced
   * Operators](http://msdn.microsoft.com/library/ff795620.aspx). For example, to
   * limit images to a specific domain, use the
   * [site:](http://msdn.microsoft.com/library/ff795613.aspx) operator. To help
   * improve relevance of an insights query (see
   * [insightsToken](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#insightstoken)),
   * you should always include the user's query term. Use this parameter only
   * with the Image Search API.Do not specify this parameter when calling the
   * Trending Images API.
   *
   * @param {object} [options] Optional Parameters.
   *
   * @param {string} [options.acceptLanguage] A comma-delimited list of one or
   * more languages to use for user interface strings. The list is in decreasing
   * order of preference. For additional information, including expected format,
   * see [RFC2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). This
   * header and the
   * [setLang](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#setlang)
   * query parameter are mutually exclusive; do not specify both. If you set this
   * header, you must also specify the
   * [cc](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#cc)
   * query parameter. To determine the market to return results for, Bing uses
   * the first supported language it finds from the list and combines it with the
   * cc parameter value. If the list does not include a supported language, Bing
   * finds the closest language and market that supports the request or it uses
   * an aggregated or default market for the results. To determine the market
   * that Bing used, see the BingAPIs-Market header. Use this header and the cc
   * query parameter only if you specify multiple languages. Otherwise, use the
   * [mkt](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#mkt)
   * and
   * [setLang](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#setlang)
   * query parameters. A user interface string is a string that's used as a label
   * in a user interface. There are few user interface strings in the JSON
   * response objects. Any links to Bing.com properties in the response objects
   * apply the specified language.
   *
   * @param {string} [options.userAgent] The user agent originating the request.
   * Bing uses the user agent to provide mobile users with an optimized
   * experience. Although optional, you are encouraged to always specify this
   * header. The user-agent should be the same string that any commonly used
   * browser sends. For information about user agents, see [RFC
   * 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). The following
   * are examples of user-agent strings. Windows Phone: Mozilla/5.0 (compatible;
   * MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA;
   * Lumia 822). Android: Mozilla / 5.0 (Linux; U; Android 2.3.5; en - us; SCH -
   * I500 Build / GINGERBREAD) AppleWebKit / 533.1 (KHTML; like Gecko) Version /
   * 4.0 Mobile Safari / 533.1. iPhone: Mozilla / 5.0 (iPhone; CPU iPhone OS 6_1
   * like Mac OS X) AppleWebKit / 536.26 (KHTML; like Gecko) Mobile / 10B142
   * iPhone4; 1 BingWeb / 3.03.1428.20120423. PC: Mozilla / 5.0 (Windows NT 6.3;
   * WOW64; Trident / 7.0; Touch; rv:11.0) like Gecko. iPad: Mozilla / 5.0 (iPad;
   * CPU OS 7_0 like Mac OS X) AppleWebKit / 537.51.1 (KHTML, like Gecko) Version
   * / 7.0 Mobile / 11A465 Safari / 9537.53
   *
   * @param {string} [options.clientId] Bing uses this header to provide users
   * with consistent behavior across Bing API calls. Bing often flights new
   * features and improvements, and it uses the client ID as a key for assigning
   * traffic on different flights. If you do not use the same client ID for a
   * user across multiple requests, then Bing may assign the user to multiple
   * conflicting flights. Being assigned to multiple conflicting flights can lead
   * to an inconsistent user experience. For example, if the second request has a
   * different flight assignment than the first, the experience may be
   * unexpected. Also, Bing can use the client ID to tailor web results to that
   * client ID’s search history, providing a richer experience for the user. Bing
   * also uses this header to help improve result rankings by analyzing the
   * activity generated by a client ID. The relevance improvements help with
   * better quality of results delivered by Bing APIs and in turn enables higher
   * click-through rates for the API consumer. IMPORTANT: Although optional, you
   * should consider this header required. Persisting the client ID across
   * multiple requests for the same end user and device combination enables 1)
   * the API consumer to receive a consistent user experience, and 2) higher
   * click-through rates via better quality of results from the Bing APIs. Each
   * user that uses your application on the device must have a unique, Bing
   * generated client ID. If you do not include this header in the request, Bing
   * generates an ID and returns it in the X-MSEdge-ClientID response header. The
   * only time that you should NOT include this header in a request is the first
   * time the user uses your app on that device. Use the client ID for each Bing
   * API request that your app makes for this user on the device. Persist the
   * client ID. To persist the ID in a browser app, use a persistent HTTP cookie
   * to ensure the ID is used across all sessions. Do not use a session cookie.
   * For other apps such as mobile apps, use the device's persistent storage to
   * persist the ID. The next time the user uses your app on that device, get the
   * client ID that you persisted. Bing responses may or may not include this
   * header. If the response includes this header, capture the client ID and use
   * it for all subsequent Bing requests for the user on that device. If you
   * include the X-MSEdge-ClientID, you must not include cookies in the request.
   *
   * @param {string} [options.clientIp] The IPv4 or IPv6 address of the client
   * device. The IP address is used to discover the user's location. Bing uses
   * the location information to determine safe search behavior. Although
   * optional, you are encouraged to always specify this header and the
   * X-Search-Location header. Do not obfuscate the address (for example, by
   * changing the last octet to 0). Obfuscating the address results in the
   * location not being anywhere near the device's actual location, which may
   * result in Bing serving erroneous results.
   *
   * @param {string} [options.location] A semicolon-delimited list of key/value
   * pairs that describe the client's geographical location. Bing uses the
   * location information to determine safe search behavior and to return
   * relevant local content. Specify the key/value pair as <key>:<value>. The
   * following are the keys that you use to specify the user's location. lat
   * (required): The latitude of the client's location, in degrees. The latitude
   * must be greater than or equal to -90.0 and less than or equal to +90.0.
   * Negative values indicate southern latitudes and positive values indicate
   * northern latitudes. long (required): The longitude of the client's location,
   * in degrees. The longitude must be greater than or equal to -180.0 and less
   * than or equal to +180.0. Negative values indicate western longitudes and
   * positive values indicate eastern longitudes. re (required): The radius, in
   * meters, which specifies the horizontal accuracy of the coordinates. Pass the
   * value returned by the device's location service. Typical values might be 22m
   * for GPS/Wi-Fi, 380m for cell tower triangulation, and 18,000m for reverse IP
   * lookup. ts (optional): The UTC UNIX timestamp of when the client was at the
   * location. (The UNIX timestamp is the number of seconds since January 1,
   * 1970.) head (optional): The client's relative heading or direction of
   * travel. Specify the direction of travel as degrees from 0 through 360,
   * counting clockwise relative to true north. Specify this key only if the sp
   * key is nonzero. sp (optional): The horizontal velocity (speed), in meters
   * per second, that the client device is traveling. alt (optional): The
   * altitude of the client device, in meters. are (optional): The radius, in
   * meters, that specifies the vertical accuracy of the coordinates. Specify
   * this key only if you specify the alt key. Although many of the keys are
   * optional, the more information that you provide, the more accurate the
   * location results are. Although optional, you are encouraged to always
   * specify the user's geographical location. Providing the location is
   * especially important if the client's IP address does not accurately reflect
   * the user's physical location (for example, if the client uses VPN). For
   * optimal results, you should include this header and the X-MSEdge-ClientIP
   * header, but at a minimum, you should include this header.
   *
   * @param {string} [options.aspect] Filter images by the following aspect
   * ratios. All: Do not filter by aspect.Specifying this value is the same as
   * not specifying the aspect parameter. Square: Return images with standard
   * aspect ratio. Wide: Return images with wide screen aspect ratio. Tall:
   * Return images with tall aspect ratio. Possible values include: 'All',
   * 'Square', 'Wide', 'Tall'
   *
   * @param {string} [options.color] Filter images by the following color
   * options. ColorOnly: Return color images. Monochrome: Return black and white
   * images. Return images with one of the following dominant colors: Black,
   * Blue, Brown, Gray, Green, Orange, Pink, Purple, Red, Teal, White, Yellow.
   * Possible values include: 'ColorOnly', 'Monochrome', 'Black', 'Blue',
   * 'Brown', 'Gray', 'Green', 'Orange', 'Pink', 'Purple', 'Red', 'Teal',
   * 'White', 'Yellow'
   *
   * @param {string} [options.countryCode] A 2-character country code of the
   * country where the results come from. For a list of possible values, see
   * [Market
   * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes).
   * If you set this parameter, you must also specify the
   * [Accept-Language](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#acceptlanguage)
   * header. Bing uses the first supported language it finds from the languages
   * list, and combine that language with the country code that you specify to
   * determine the market to return results for. If the languages list does not
   * include a supported language, Bing finds the closest language and market
   * that supports the request, or it may use an aggregated or default market for
   * the results instead of a specified one. You should use this query parameter
   * and the Accept-Language query parameter only if you specify multiple
   * languages; otherwise, you should use the mkt and setLang query parameters.
   * This parameter and the
   * [mkt](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#mkt)
   * query parameter are mutually exclusive—do not specify both.
   *
   * @param {number} [options.count] The number of images to return in the
   * response. The actual number delivered may be less than requested. The
   * default is 35. The maximum value is 150. You use this parameter along with
   * the offset parameter to page results.For example, if your user interface
   * displays 20 images per page, set count to 20 and offset to 0 to get the
   * first page of results.For each subsequent page, increment offset by 20 (for
   * example, 0, 20, 40). Use this parameter only with the Image Search API.Do
   * not specify this parameter when calling the Insights, Trending Images, or
   * Web Search APIs.
   *
   * @param {string} [options.freshness] Filter images by the following discovery
   * options. Day: Return images discovered by Bing within the last 24 hours.
   * Week: Return images discovered by Bing within the last 7 days. Month: Return
   * images discovered by Bing within the last 30 days. Possible values include:
   * 'Day', 'Week', 'Month'
   *
   * @param {number} [options.height] Filter images that have the specified
   * height, in pixels. You may use this filter with the size filter to return
   * small images that have a height of 150 pixels.
   *
   * @param {string} [options.id] An ID that uniquely identifies an image. Use
   * this parameter to ensure that the specified image is the first image in the
   * list of images that Bing returns. The
   * [Image](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#image)
   * object's imageId field contains the ID that you set this parameter to.
   *
   * @param {string} [options.imageContent] Filter images by the following
   * content types. Face: Return images that show only a person's face. Portrait:
   * Return images that show only a person's head and shoulders. Possible values
   * include: 'Face', 'Portrait'
   *
   * @param {string} [options.imageType] Filter images by the following image
   * types. AnimatedGif: Return only animated GIFs. Clipart: Return only clip art
   * images. Line: Return only line drawings. Photo: Return only
   * photographs(excluding line drawings, animated Gifs, and clip art). Shopping:
   * Return only images that contain items where Bing knows of a merchant that is
   * selling the items. This option is valid in the en - US market
   * only.Transparent: Return only images with a transparent background. Possible
   * values include: 'AnimatedGif', 'Clipart', 'Line', 'Photo', 'Shopping',
   * 'Transparent'
   *
   * @param {string} [options.license] Filter images by the following license
   * types. All: Do not filter by license type.Specifying this value is the same
   * as not specifying the license parameter. Any: Return images that are under
   * any license type. The response doesn't include images that do not specify a
   * license or the license is unknown. Public: Return images where the creator
   * has waived their exclusive rights, to the fullest extent allowed by law.
   * Share: Return images that may be shared with others. Changing or editing the
   * image might not be allowed. Also, modifying, sharing, and using the image
   * for commercial purposes might not be allowed. Typically, this option returns
   * the most images. ShareCommercially: Return images that may be shared with
   * others for personal or commercial purposes. Changing or editing the image
   * might not be allowed. Modify: Return images that may be modified, shared,
   * and used. Changing or editing the image might not be allowed. Modifying,
   * sharing, and using the image for commercial purposes might not be allowed.
   * ModifyCommercially: Return images that may be modified, shared, and used for
   * personal or commercial purposes. Typically, this option returns the fewest
   * images. For more information about these license types, see [Filter Images
   * By License Type](http://go.microsoft.com/fwlink/?LinkId=309768). Possible
   * values include: 'All', 'Any', 'Public', 'Share', 'ShareCommercially',
   * 'Modify', 'ModifyCommercially'
   *
   * @param {string} [options.market] The market where the results come from.
   * Typically, mkt is the country where the user is making the request from.
   * However, it could be a different country if the user is not located in a
   * country where Bing delivers results. The market must be in the form
   * <language code>-<country code>. For example, en-US. The string is case
   * insensitive. For a list of possible market values, see [Market
   * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes).
   * NOTE: If known, you are encouraged to always specify the market. Specifying
   * the market helps Bing route the request and return an appropriate and
   * optimal response. If you specify a market that is not listed in [Market
   * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes),
   * Bing uses a best fit market code based on an internal mapping that is
   * subject to change. This parameter and the
   * [cc](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#cc)
   * query parameter are mutually exclusive—do not specify both.
   *
   * @param {number} [options.maxFileSize] Filter images that are less than or
   * equal to the specified file size. The maximum file size that you may specify
   * is 520,192 bytes. If you specify a larger value, the API uses 520,192. It is
   * possible that the response may include images that are slightly larger than
   * the specified maximum. You may specify this filter and minFileSize to filter
   * images within a range of file sizes.
   *
   * @param {number} [options.maxHeight] Filter images that have a height that is
   * less than or equal to the specified height. Specify the height in pixels.
   * You may specify this filter and minHeight to filter images within a range of
   * heights. This filter and the height filter are mutually exclusive.
   *
   * @param {number} [options.maxWidth] Filter images that have a width that is
   * less than or equal to the specified width. Specify the width in pixels. You
   * may specify this filter and maxWidth to filter images within a range of
   * widths. This filter and the width filter are mutually exclusive.
   *
   * @param {number} [options.minFileSize] Filter images that are greater than or
   * equal to the specified file size. The maximum file size that you may specify
   * is 520,192 bytes. If you specify a larger value, the API uses 520,192. It is
   * possible that the response may include images that are slightly smaller than
   * the specified minimum. You may specify this filter and maxFileSize to filter
   * images within a range of file sizes.
   *
   * @param {number} [options.minHeight] Filter images that have a height that is
   * greater than or equal to the specified height. Specify the height in pixels.
   * You may specify this filter and maxHeight to filter images within a range of
   * heights. This filter and the height filter are mutually exclusive.
   *
   * @param {number} [options.minWidth] Filter images that have a width that is
   * greater than or equal to the specified width. Specify the width in pixels.
   * You may specify this filter and maxWidth to filter images within a range of
   * widths. This filter and the width filter are mutually exclusive.
   *
   * @param {number} [options.offset] The zero-based offset that indicates the
   * number of images to skip before returning images. The default is 0. The
   * offset should be less than
   * ([totalEstimatedMatches](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#totalestimatedmatches)
   * - count). Use this parameter along with the count parameter to page results.
   * For example, if your user interface displays 20 images per page, set count
   * to 20 and offset to 0 to get the first page of results. For each subsequent
   * page, increment offset by 20 (for example, 0, 20, 40). It is possible for
   * multiple pages to include some overlap in results. To prevent duplicates,
   * see
   * [nextOffset](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#nextoffset).
   * Use this parameter only with the Image API. Do not specify this parameter
   * when calling the Trending Images API or the Web Search API.
   *
   * @param {string} [options.safeSearch] Filter images for adult content. The
   * following are the possible filter values. Off: May return images with adult
   * content. If the request is through the Image Search API, the response
   * includes thumbnail images that are clear (non-fuzzy). However, if the
   * request is through the Web Search API, the response includes thumbnail
   * images that are pixelated (fuzzy). Moderate: If the request is through the
   * Image Search API, the response doesn't include images with adult content. If
   * the request is through the Web Search API, the response may include images
   * with adult content (the thumbnail images are pixelated (fuzzy)). Strict: Do
   * not return images with adult content. The default is Moderate. If the
   * request comes from a market that Bing's adult policy requires that
   * safeSearch is set to Strict, Bing ignores the safeSearch value and uses
   * Strict. If you use the site: query operator, there is the chance that the
   * response may contain adult content regardless of what the safeSearch query
   * parameter is set to. Use site: only if you are aware of the content on the
   * site and your scenario supports the possibility of adult content. Possible
   * values include: 'Off', 'Moderate', 'Strict'
   *
   * @param {string} [options.size] Filter images by the following sizes. All: Do
   * not filter by size. Specifying this value is the same as not specifying the
   * size parameter. Small: Return images that are less than 200x200 pixels.
   * Medium: Return images that are greater than or equal to 200x200 pixels but
   * less than 500x500 pixels. Large: Return images that are 500x500 pixels or
   * larger. Wallpaper: Return wallpaper images. You may use this parameter along
   * with the height or width parameters. For example, you may use height and
   * size to request small images that are 150 pixels tall. Possible values
   * include: 'All', 'Small', 'Medium', 'Large', 'Wallpaper'
   *
   * @param {string} [options.setLang] The language to use for user interface
   * strings. Specify the language using the ISO 639-1 2-letter language code.
   * For example, the language code for English is EN. The default is EN
   * (English). Although optional, you should always specify the language.
   * Typically, you set setLang to the same language specified by mkt unless the
   * user wants the user interface strings displayed in a different language.
   * This parameter and the
   * [Accept-Language](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#acceptlanguage)
   * header are mutually exclusive; do not specify both. A user interface string
   * is a string that's used as a label in a user interface. There are few user
   * interface strings in the JSON response objects. Also, any links to Bing.com
   * properties in the response objects apply the specified language.
   *
   * @param {number} [options.width] Filter images that have the specified width,
   * in pixels. You may use this filter with the size filter to return small
   * images that have a width of 150 pixels.
   *
   * @param {object} [options.customHeaders] Headers that will be added to the
   * request
   *
   * @returns {Promise} A promise is returned
   *
   * @resolve {HttpOperationResponse<Images>} - The deserialized result object.
   *
   * @reject {Error} - The error object.
   */
  imageSearchWithHttpOperationResponse(customConfig, query, options) {
    let client = this.client;
    let self = this;
    return new Promise((resolve, reject) => {
      self._imageSearch(customConfig, query, options, (err, result, request, response) => {
        let httpOperationResponse = new msRest.HttpOperationResponse(request, response);
        httpOperationResponse.body = result;
        if (err) { reject(err); }
        else { resolve(httpOperationResponse); }
        return;
      });
    });
  }

  /**
   * @summary The Custom Image Search API lets you send an image search query to
   * Bing and get image results found in your custom view of the web.
   *
   * @param {string} customConfig The identifier for the custom search
   * configuration
   *
   * @param {string} query The user's search query term. The term cannot be
   * empty. The term may contain [Bing Advanced
   * Operators](http://msdn.microsoft.com/library/ff795620.aspx). For example, to
   * limit images to a specific domain, use the
   * [site:](http://msdn.microsoft.com/library/ff795613.aspx) operator. To help
   * improve relevance of an insights query (see
   * [insightsToken](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#insightstoken)),
   * you should always include the user's query term. Use this parameter only
   * with the Image Search API.Do not specify this parameter when calling the
   * Trending Images API.
   *
   * @param {object} [options] Optional Parameters.
   *
   * @param {string} [options.acceptLanguage] A comma-delimited list of one or
   * more languages to use for user interface strings. The list is in decreasing
   * order of preference. For additional information, including expected format,
   * see [RFC2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). This
   * header and the
   * [setLang](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#setlang)
   * query parameter are mutually exclusive; do not specify both. If you set this
   * header, you must also specify the
   * [cc](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#cc)
   * query parameter. To determine the market to return results for, Bing uses
   * the first supported language it finds from the list and combines it with the
   * cc parameter value. If the list does not include a supported language, Bing
   * finds the closest language and market that supports the request or it uses
   * an aggregated or default market for the results. To determine the market
   * that Bing used, see the BingAPIs-Market header. Use this header and the cc
   * query parameter only if you specify multiple languages. Otherwise, use the
   * [mkt](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#mkt)
   * and
   * [setLang](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#setlang)
   * query parameters. A user interface string is a string that's used as a label
   * in a user interface. There are few user interface strings in the JSON
   * response objects. Any links to Bing.com properties in the response objects
   * apply the specified language.
   *
   * @param {string} [options.userAgent] The user agent originating the request.
   * Bing uses the user agent to provide mobile users with an optimized
   * experience. Although optional, you are encouraged to always specify this
   * header. The user-agent should be the same string that any commonly used
   * browser sends. For information about user agents, see [RFC
   * 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). The following
   * are examples of user-agent strings. Windows Phone: Mozilla/5.0 (compatible;
   * MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA;
   * Lumia 822). Android: Mozilla / 5.0 (Linux; U; Android 2.3.5; en - us; SCH -
   * I500 Build / GINGERBREAD) AppleWebKit / 533.1 (KHTML; like Gecko) Version /
   * 4.0 Mobile Safari / 533.1. iPhone: Mozilla / 5.0 (iPhone; CPU iPhone OS 6_1
   * like Mac OS X) AppleWebKit / 536.26 (KHTML; like Gecko) Mobile / 10B142
   * iPhone4; 1 BingWeb / 3.03.1428.20120423. PC: Mozilla / 5.0 (Windows NT 6.3;
   * WOW64; Trident / 7.0; Touch; rv:11.0) like Gecko. iPad: Mozilla / 5.0 (iPad;
   * CPU OS 7_0 like Mac OS X) AppleWebKit / 537.51.1 (KHTML, like Gecko) Version
   * / 7.0 Mobile / 11A465 Safari / 9537.53
   *
   * @param {string} [options.clientId] Bing uses this header to provide users
   * with consistent behavior across Bing API calls. Bing often flights new
   * features and improvements, and it uses the client ID as a key for assigning
   * traffic on different flights. If you do not use the same client ID for a
   * user across multiple requests, then Bing may assign the user to multiple
   * conflicting flights. Being assigned to multiple conflicting flights can lead
   * to an inconsistent user experience. For example, if the second request has a
   * different flight assignment than the first, the experience may be
   * unexpected. Also, Bing can use the client ID to tailor web results to that
   * client ID’s search history, providing a richer experience for the user. Bing
   * also uses this header to help improve result rankings by analyzing the
   * activity generated by a client ID. The relevance improvements help with
   * better quality of results delivered by Bing APIs and in turn enables higher
   * click-through rates for the API consumer. IMPORTANT: Although optional, you
   * should consider this header required. Persisting the client ID across
   * multiple requests for the same end user and device combination enables 1)
   * the API consumer to receive a consistent user experience, and 2) higher
   * click-through rates via better quality of results from the Bing APIs. Each
   * user that uses your application on the device must have a unique, Bing
   * generated client ID. If you do not include this header in the request, Bing
   * generates an ID and returns it in the X-MSEdge-ClientID response header. The
   * only time that you should NOT include this header in a request is the first
   * time the user uses your app on that device. Use the client ID for each Bing
   * API request that your app makes for this user on the device. Persist the
   * client ID. To persist the ID in a browser app, use a persistent HTTP cookie
   * to ensure the ID is used across all sessions. Do not use a session cookie.
   * For other apps such as mobile apps, use the device's persistent storage to
   * persist the ID. The next time the user uses your app on that device, get the
   * client ID that you persisted. Bing responses may or may not include this
   * header. If the response includes this header, capture the client ID and use
   * it for all subsequent Bing requests for the user on that device. If you
   * include the X-MSEdge-ClientID, you must not include cookies in the request.
   *
   * @param {string} [options.clientIp] The IPv4 or IPv6 address of the client
   * device. The IP address is used to discover the user's location. Bing uses
   * the location information to determine safe search behavior. Although
   * optional, you are encouraged to always specify this header and the
   * X-Search-Location header. Do not obfuscate the address (for example, by
   * changing the last octet to 0). Obfuscating the address results in the
   * location not being anywhere near the device's actual location, which may
   * result in Bing serving erroneous results.
   *
   * @param {string} [options.location] A semicolon-delimited list of key/value
   * pairs that describe the client's geographical location. Bing uses the
   * location information to determine safe search behavior and to return
   * relevant local content. Specify the key/value pair as <key>:<value>. The
   * following are the keys that you use to specify the user's location. lat
   * (required): The latitude of the client's location, in degrees. The latitude
   * must be greater than or equal to -90.0 and less than or equal to +90.0.
   * Negative values indicate southern latitudes and positive values indicate
   * northern latitudes. long (required): The longitude of the client's location,
   * in degrees. The longitude must be greater than or equal to -180.0 and less
   * than or equal to +180.0. Negative values indicate western longitudes and
   * positive values indicate eastern longitudes. re (required): The radius, in
   * meters, which specifies the horizontal accuracy of the coordinates. Pass the
   * value returned by the device's location service. Typical values might be 22m
   * for GPS/Wi-Fi, 380m for cell tower triangulation, and 18,000m for reverse IP
   * lookup. ts (optional): The UTC UNIX timestamp of when the client was at the
   * location. (The UNIX timestamp is the number of seconds since January 1,
   * 1970.) head (optional): The client's relative heading or direction of
   * travel. Specify the direction of travel as degrees from 0 through 360,
   * counting clockwise relative to true north. Specify this key only if the sp
   * key is nonzero. sp (optional): The horizontal velocity (speed), in meters
   * per second, that the client device is traveling. alt (optional): The
   * altitude of the client device, in meters. are (optional): The radius, in
   * meters, that specifies the vertical accuracy of the coordinates. Specify
   * this key only if you specify the alt key. Although many of the keys are
   * optional, the more information that you provide, the more accurate the
   * location results are. Although optional, you are encouraged to always
   * specify the user's geographical location. Providing the location is
   * especially important if the client's IP address does not accurately reflect
   * the user's physical location (for example, if the client uses VPN). For
   * optimal results, you should include this header and the X-MSEdge-ClientIP
   * header, but at a minimum, you should include this header.
   *
   * @param {string} [options.aspect] Filter images by the following aspect
   * ratios. All: Do not filter by aspect.Specifying this value is the same as
   * not specifying the aspect parameter. Square: Return images with standard
   * aspect ratio. Wide: Return images with wide screen aspect ratio. Tall:
   * Return images with tall aspect ratio. Possible values include: 'All',
   * 'Square', 'Wide', 'Tall'
   *
   * @param {string} [options.color] Filter images by the following color
   * options. ColorOnly: Return color images. Monochrome: Return black and white
   * images. Return images with one of the following dominant colors: Black,
   * Blue, Brown, Gray, Green, Orange, Pink, Purple, Red, Teal, White, Yellow.
   * Possible values include: 'ColorOnly', 'Monochrome', 'Black', 'Blue',
   * 'Brown', 'Gray', 'Green', 'Orange', 'Pink', 'Purple', 'Red', 'Teal',
   * 'White', 'Yellow'
   *
   * @param {string} [options.countryCode] A 2-character country code of the
   * country where the results come from. For a list of possible values, see
   * [Market
   * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes).
   * If you set this parameter, you must also specify the
   * [Accept-Language](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#acceptlanguage)
   * header. Bing uses the first supported language it finds from the languages
   * list, and combine that language with the country code that you specify to
   * determine the market to return results for. If the languages list does not
   * include a supported language, Bing finds the closest language and market
   * that supports the request, or it may use an aggregated or default market for
   * the results instead of a specified one. You should use this query parameter
   * and the Accept-Language query parameter only if you specify multiple
   * languages; otherwise, you should use the mkt and setLang query parameters.
   * This parameter and the
   * [mkt](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#mkt)
   * query parameter are mutually exclusive—do not specify both.
   *
   * @param {number} [options.count] The number of images to return in the
   * response. The actual number delivered may be less than requested. The
   * default is 35. The maximum value is 150. You use this parameter along with
   * the offset parameter to page results.For example, if your user interface
   * displays 20 images per page, set count to 20 and offset to 0 to get the
   * first page of results.For each subsequent page, increment offset by 20 (for
   * example, 0, 20, 40). Use this parameter only with the Image Search API.Do
   * not specify this parameter when calling the Insights, Trending Images, or
   * Web Search APIs.
   *
   * @param {string} [options.freshness] Filter images by the following discovery
   * options. Day: Return images discovered by Bing within the last 24 hours.
   * Week: Return images discovered by Bing within the last 7 days. Month: Return
   * images discovered by Bing within the last 30 days. Possible values include:
   * 'Day', 'Week', 'Month'
   *
   * @param {number} [options.height] Filter images that have the specified
   * height, in pixels. You may use this filter with the size filter to return
   * small images that have a height of 150 pixels.
   *
   * @param {string} [options.id] An ID that uniquely identifies an image. Use
   * this parameter to ensure that the specified image is the first image in the
   * list of images that Bing returns. The
   * [Image](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#image)
   * object's imageId field contains the ID that you set this parameter to.
   *
   * @param {string} [options.imageContent] Filter images by the following
   * content types. Face: Return images that show only a person's face. Portrait:
   * Return images that show only a person's head and shoulders. Possible values
   * include: 'Face', 'Portrait'
   *
   * @param {string} [options.imageType] Filter images by the following image
   * types. AnimatedGif: Return only animated GIFs. Clipart: Return only clip art
   * images. Line: Return only line drawings. Photo: Return only
   * photographs(excluding line drawings, animated Gifs, and clip art). Shopping:
   * Return only images that contain items where Bing knows of a merchant that is
   * selling the items. This option is valid in the en - US market
   * only.Transparent: Return only images with a transparent background. Possible
   * values include: 'AnimatedGif', 'Clipart', 'Line', 'Photo', 'Shopping',
   * 'Transparent'
   *
   * @param {string} [options.license] Filter images by the following license
   * types. All: Do not filter by license type.Specifying this value is the same
   * as not specifying the license parameter. Any: Return images that are under
   * any license type. The response doesn't include images that do not specify a
   * license or the license is unknown. Public: Return images where the creator
   * has waived their exclusive rights, to the fullest extent allowed by law.
   * Share: Return images that may be shared with others. Changing or editing the
   * image might not be allowed. Also, modifying, sharing, and using the image
   * for commercial purposes might not be allowed. Typically, this option returns
   * the most images. ShareCommercially: Return images that may be shared with
   * others for personal or commercial purposes. Changing or editing the image
   * might not be allowed. Modify: Return images that may be modified, shared,
   * and used. Changing or editing the image might not be allowed. Modifying,
   * sharing, and using the image for commercial purposes might not be allowed.
   * ModifyCommercially: Return images that may be modified, shared, and used for
   * personal or commercial purposes. Typically, this option returns the fewest
   * images. For more information about these license types, see [Filter Images
   * By License Type](http://go.microsoft.com/fwlink/?LinkId=309768). Possible
   * values include: 'All', 'Any', 'Public', 'Share', 'ShareCommercially',
   * 'Modify', 'ModifyCommercially'
   *
   * @param {string} [options.market] The market where the results come from.
   * Typically, mkt is the country where the user is making the request from.
   * However, it could be a different country if the user is not located in a
   * country where Bing delivers results. The market must be in the form
   * <language code>-<country code>. For example, en-US. The string is case
   * insensitive. For a list of possible market values, see [Market
   * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes).
   * NOTE: If known, you are encouraged to always specify the market. Specifying
   * the market helps Bing route the request and return an appropriate and
   * optimal response. If you specify a market that is not listed in [Market
   * Codes](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#market-codes),
   * Bing uses a best fit market code based on an internal mapping that is
   * subject to change. This parameter and the
   * [cc](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#cc)
   * query parameter are mutually exclusive—do not specify both.
   *
   * @param {number} [options.maxFileSize] Filter images that are less than or
   * equal to the specified file size. The maximum file size that you may specify
   * is 520,192 bytes. If you specify a larger value, the API uses 520,192. It is
   * possible that the response may include images that are slightly larger than
   * the specified maximum. You may specify this filter and minFileSize to filter
   * images within a range of file sizes.
   *
   * @param {number} [options.maxHeight] Filter images that have a height that is
   * less than or equal to the specified height. Specify the height in pixels.
   * You may specify this filter and minHeight to filter images within a range of
   * heights. This filter and the height filter are mutually exclusive.
   *
   * @param {number} [options.maxWidth] Filter images that have a width that is
   * less than or equal to the specified width. Specify the width in pixels. You
   * may specify this filter and maxWidth to filter images within a range of
   * widths. This filter and the width filter are mutually exclusive.
   *
   * @param {number} [options.minFileSize] Filter images that are greater than or
   * equal to the specified file size. The maximum file size that you may specify
   * is 520,192 bytes. If you specify a larger value, the API uses 520,192. It is
   * possible that the response may include images that are slightly smaller than
   * the specified minimum. You may specify this filter and maxFileSize to filter
   * images within a range of file sizes.
   *
   * @param {number} [options.minHeight] Filter images that have a height that is
   * greater than or equal to the specified height. Specify the height in pixels.
   * You may specify this filter and maxHeight to filter images within a range of
   * heights. This filter and the height filter are mutually exclusive.
   *
   * @param {number} [options.minWidth] Filter images that have a width that is
   * greater than or equal to the specified width. Specify the width in pixels.
   * You may specify this filter and maxWidth to filter images within a range of
   * widths. This filter and the width filter are mutually exclusive.
   *
   * @param {number} [options.offset] The zero-based offset that indicates the
   * number of images to skip before returning images. The default is 0. The
   * offset should be less than
   * ([totalEstimatedMatches](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#totalestimatedmatches)
   * - count). Use this parameter along with the count parameter to page results.
   * For example, if your user interface displays 20 images per page, set count
   * to 20 and offset to 0 to get the first page of results. For each subsequent
   * page, increment offset by 20 (for example, 0, 20, 40). It is possible for
   * multiple pages to include some overlap in results. To prevent duplicates,
   * see
   * [nextOffset](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#nextoffset).
   * Use this parameter only with the Image API. Do not specify this parameter
   * when calling the Trending Images API or the Web Search API.
   *
   * @param {string} [options.safeSearch] Filter images for adult content. The
   * following are the possible filter values. Off: May return images with adult
   * content. If the request is through the Image Search API, the response
   * includes thumbnail images that are clear (non-fuzzy). However, if the
   * request is through the Web Search API, the response includes thumbnail
   * images that are pixelated (fuzzy). Moderate: If the request is through the
   * Image Search API, the response doesn't include images with adult content. If
   * the request is through the Web Search API, the response may include images
   * with adult content (the thumbnail images are pixelated (fuzzy)). Strict: Do
   * not return images with adult content. The default is Moderate. If the
   * request comes from a market that Bing's adult policy requires that
   * safeSearch is set to Strict, Bing ignores the safeSearch value and uses
   * Strict. If you use the site: query operator, there is the chance that the
   * response may contain adult content regardless of what the safeSearch query
   * parameter is set to. Use site: only if you are aware of the content on the
   * site and your scenario supports the possibility of adult content. Possible
   * values include: 'Off', 'Moderate', 'Strict'
   *
   * @param {string} [options.size] Filter images by the following sizes. All: Do
   * not filter by size. Specifying this value is the same as not specifying the
   * size parameter. Small: Return images that are less than 200x200 pixels.
   * Medium: Return images that are greater than or equal to 200x200 pixels but
   * less than 500x500 pixels. Large: Return images that are 500x500 pixels or
   * larger. Wallpaper: Return wallpaper images. You may use this parameter along
   * with the height or width parameters. For example, you may use height and
   * size to request small images that are 150 pixels tall. Possible values
   * include: 'All', 'Small', 'Medium', 'Large', 'Wallpaper'
   *
   * @param {string} [options.setLang] The language to use for user interface
   * strings. Specify the language using the ISO 639-1 2-letter language code.
   * For example, the language code for English is EN. The default is EN
   * (English). Although optional, you should always specify the language.
   * Typically, you set setLang to the same language specified by mkt unless the
   * user wants the user interface strings displayed in a different language.
   * This parameter and the
   * [Accept-Language](https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-images-api-v7-reference#acceptlanguage)
   * header are mutually exclusive; do not specify both. A user interface string
   * is a string that's used as a label in a user interface. There are few user
   * interface strings in the JSON response objects. Also, any links to Bing.com
   * properties in the response objects apply the specified language.
   *
   * @param {number} [options.width] Filter images that have the specified width,
   * in pixels. You may use this filter with the size filter to return small
   * images that have a width of 150 pixels.
   *
   * @param {object} [options.customHeaders] Headers that will be added to the
   * request
   *
   * @param {function} [optionalCallback] - The optional callback.
   *
   * @returns {function|Promise} If a callback was passed as the last parameter
   * then it returns the callback else returns a Promise.
   *
   * {Promise} A promise is returned
   *
   *                      @resolve {Images} - The deserialized result object.
   *
   *                      @reject {Error} - The error object.
   *
   * {function} optionalCallback(err, result, request, response)
   *
   *                      {Error}  err        - The Error object if an error occurred, null otherwise.
   *
   *                      {object} [result]   - The deserialized result object if an error did not occur.
   *                      See {@link Images} for more information.
   *
   *                      {object} [request]  - The HTTP Request object if an error did not occur.
   *
   *                      {stream} [response] - The HTTP Response stream if an error did not occur.
   */
  imageSearch(customConfig, query, options, optionalCallback) {
    let client = this.client;
    let self = this;
    if (!optionalCallback && typeof options === 'function') {
      optionalCallback = options;
      options = null;
    }
    if (!optionalCallback) {
      return new Promise((resolve, reject) => {
        self._imageSearch(customConfig, query, options, (err, result, request, response) => {
          if (err) { reject(err); }
          else { resolve(result); }
          return;
        });
      });
    } else {
      return self._imageSearch(customConfig, query, options, optionalCallback);
    }
  }

}

module.exports = CustomInstance;
